From b08014b5946ba933323d0b69bd486807d4e648b7 Mon Sep 17 00:00:00 2001 From: guy Date: Fri, 7 Oct 2022 02:06:37 +0800 Subject: [PATCH] resizeObserver --- src/core/platform/web/detectElementResize.js | 29 ++++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/core/platform/web/detectElementResize.js b/src/core/platform/web/detectElementResize.js index b34d21771..7137bb50c 100644 --- a/src/core/platform/web/detectElementResize.js +++ b/src/core/platform/web/detectElementResize.js @@ -112,7 +112,21 @@ }; var addResizeListener = function (element, fn) { - if (attachEvent) { + if (window.ResizeObserver) { + if (!element.__resizeObserver__) { + var resizeObserver = new window.ResizeObserver(function () { + element.__resizeListeners__.forEach(function (listener) { + listener(); + }); + }); + resizeObserver.observe(element); + element.__resizeObserver__ = resizeObserver; + } + if (!element.__resizeListeners__) { + element.__resizeListeners__ = []; + } + element.__resizeListeners__.push(fn); + } else if (attachEvent) { element.attachEvent("onresize", fn); BI.nextTick(fn); } else { @@ -137,8 +151,17 @@ } }; var removeResizeListener = function (element, fn) { - if (attachEvent) element.detachEvent("onresize", fn); - else { + if (window.ResizeObserver) { + var index = element.__resizeListeners__.indexOf(fn); + if (index >= 0) { + element.__resizeListeners__.splice(index, 1); + if (!element.__resizeListeners__.length) { + element.__resizeObserver__ && element.__resizeObserver__.unobserve(element); + } + } + } else if (attachEvent) { + element.detachEvent("onresize", fn); + } else { element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1); if (!element.__resizeListeners__.length) { element.removeEventListener("scroll", scrollListener);