上代码:

/*** @description 监听元素尺寸变化* @author: hruomei* @update* @date: 2021-07-22 11:29:40*/export default class ResizeObserver {constructor() {}static handleResize(e) {const trigger = e.target.__resizeTrigger__;if (!trigger) return;const handlers = trigger.__z_resizeListeners;if (handlers) {handlers.forEach(({ handler, context }) => {handler.apply(context, [e]);});}}static removeHandler(ele, handler, context) {const handlers = ele.__z_resizeListeners;if (!handlers) return;ele.__z_resizeListeners = handlers.filter(h => !(h.handler === handler && h.context === context));}static createResizeTrigger(ele) {let obj = document.createElement('object');obj.setAttribute('style','display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden;opacity: 0; pointer-events: none; z-index: -1;');obj.onload = ResizeObserver.handleObjectLoad;obj.type = 'text/html';ele.appendChild(obj);obj.data = 'about:blank';return obj;}static handleObjectLoad() {this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__;this.contentDocument.defaultView.addEventListener('resize', ResizeObserver.handleResize);}on(ele, handler, context) {if (!ele) throw new Error('illegal element')let handlers = ele.__z_resizeListeners;if (!handlers) {handlers = [];ele.__z_resizeListeners = handlers;if (window.getComputedStyle(ele, null).position === 'static') {ele.style.position = 'relative';}let obj = ResizeObserver.createResizeTrigger(ele);ele.__resizeTrigger__ = obj;obj.__resizeElement__ = ele;}handlers.push({handler,context});}off(ele, handler, context) {if (!ele) throw new Error('illegal element')let handlers = ele.__z_resizeListeners;if (!handlers) return;ResizeObserver.removeHandler(ele, handler, context);if (!handlers.length) {let trigger = ele.__resizeTrigger__;if (trigger) {trigger.contentDocument.defaultView.removeEventListener('resize', ResizeObserver.handleResize);ele.removeChild(trigger);delete ele.__resizeTrigger__;}delete ele.__z_resizeListeners;}}
}

用法:

const resizeObserver = new ResizeObserver();
const element = document.getElementById('netcallLeftWrapper');
const callback = () => {console.log('leftWrapper尺寸变化')
});// 监听resize事件
resizeObserver.on(element, callback, this);// 取消监听resize事件
resizeObserver.off(element, callback, this);

js监听元素尺寸变化相关推荐

  1. js如何监听元素事件是否被移除_JavaScript 监听元素是否进入/移出可视区域

    JavaScript 监听元素是否进入/移出可视区域 常规操作 防抖节流 IntersectionObserver 兼容的代码 常规操作 通常的做法是,监听srcoll事件,根据元素的offset来判 ...

  2. js监听页面或元素scroll事件,滚动到底部或顶部

    基本原理: 1.滚动到底部 元素的滚动距离 + 元素的可视距离 == 元素的滚动条总距离2.滚动到顶部 元素的滚动距离 == 0 监听页面滚动 <!DOCTYPE html> <ht ...

  3. JS监听页面元素删除子节点、增加子节点、修改子节点的内容

    监听这个事件DOMSubtreeModified. 表示如果当前监听元素的子节点有改动:包括删除子节点.增加子节点.修改子节点的内容,都会触发这个事件. var container = documen ...

  4. js IntersectionObserver监听元素的显示与隐藏,图片懒加载

    IntersectionObserver监听显隐,监听元素在可视窗口中展示的比例,1:完全展示出来了,0:完全遮挡了,opacity和visibility控制的显隐是不会触发的.该api常用于图片懒加 ...

  5. vue动态获取元素距离页面顶部的高度_VUE如何实时监听元素距离顶部高度

    VUE如何实时监听元素距离顶部高度 发布时间:2020-07-30 09:09:43 来源:亿速云 阅读:150 作者:小猪 这篇文章主要讲解了VUE如何实时监听元素距离顶部高度,内容清晰明了,对此有 ...

  6. vue获取元素距离页面顶部的距离_VUE实时监听元素距离顶部高度的操作

    效果图如下所示 .html 今日热门 今日热销 .js mounted(){ window.addEventListener('scroll',this.handleScrollx,true) }, ...

  7. js监听鼠标拖动事件(按住左键拖动触发,松开左键取消)

    此段代码,实现了左键点击id元素内区域后,拖动鼠标到边缘区域滚动条(内部class元素的滚动条)自动滚动,松开鼠标后取消事件 业务需要记录一下 $(function () {var div=docum ...

  8. linux输入数字切换浏览器tab,js监听浏览器tab窗口切换

    js监听浏览器tab窗口切换 --IT唐伯虎 摘要:js监听浏览器tab窗口切换. if (document.hidden !== undefined) { document.addEventList ...

  9. html js按钮事件监听,JS监听事件

    对象 - JS监听事件 ¶ 作者:KK 发表日期:2016.2.21 在准备讲解后面的window对象之前,这里将话题转回来事件这里 平时咱们在一个元素里加个onclick属性,属性值写JS代码,这样 ...

最新文章

  1. python位运算符
  2. 腾讯基于 Flink 的实时流计算平台演进之路
  3. 主网上线也不开心,EOS背后公司被钓鱼
  4. 搭建Hadoop2.6.4伪分布式
  5. ibatis 3.x 实例
  6. RxJava Subject
  7. img标签绝对位置定位,图片显示在签名之上。
  8. 【WinForm】自己写一个截图软件1 --注册全局热键
  9. matlab卷积神经网络的创建与图片识别
  10. Unity_Demo | 中世纪风3D-RPG游戏
  11. 信息学奥赛一本通 1336:【例3-1】找树根和孩子
  12. HDU 3533 Escape(BFS)
  13. 区块链相关的关键概念
  14. netlink编程注意事项
  15. win10 1809无法更新(扩展EFI分区)
  16. CSS calc()函数
  17. Deepspeed:让大规模深度学习更快更省资源的神器
  18. x86汇编_指令集大全_笔记_6
  19. 人工智能如何改善运输和物流
  20. 多卡聚合路由器5G+4G是什么意思

热门文章

  1. 预约挂号后患者实际就诊情况的数据分析
  2. Day114.尚医通:用户认证、阿里云OSS、就诊人管理
  3. 从今天起 一周至少看一本书 不能再蹉跎
  4. 浩顺考勤机二次开发(第二版,附实测可用的demo)
  5. 最新整理Q萌回合手游/青灯奇缘+GM授权后台
  6. 09 七段-复利:营造长期的局部垄断
  7. 卡西欧计算机如何取消g,卡西欧g-shock怎么关闭闹钟 gshock取消闹钟方法
  8. PHP快速入门01-初识PHP语言
  9. CT图像重建算法------迭代投影模型之距离驱动算法(Distance-Driven Model,DDM)
  10. Android技术点总结