addeventlistener怎么监听变量的变化_MutationObserver: dom变化监听 给你代码

8e3a6547dc1bada8632c028adca132c2.png

如何来监听dom变化?

工作中突然有一个需求,必须你要监听dom的插入,那么就需要去监听dom变化。在一般印象中,监听事件应该是这么实现的比如 xx.addEventListener(xxx)。而实际上关于这个dom变化有一套html5标准。如在mdn写到MutationObserver接口提供了监视对DOM树所做更改的能力。它被设计为旧的Mutation Events功能的替代品,该功能是DOM3 Events规范的一部分。

使用方法 var observer = new MutationObserver(callback); 该构造函数会在指定dom事件触发的时候,调用回调函数。callback方法有2个参数,一个是描述所有被触发改动的 MutationRecord 对象数组,另一个是调用该函数的MutationObserver 对象。第一个属性比较重要,返回了改变的信息。

然后调用observer.observe(targetNode, observerOptions);该方法配置了 MutationObserver 对象的回调方法以开始接收与给定选项匹配的DOM变化的通知。根据配置,观察者会观察 DOM 树中的单个 Node,也可能会观察被指定节点的部分或者所有的子孙节点。 observerOptions记录了选项设置。支持{attributeFilter, attributeOldValue, attributes, characterData, characterDataOldValue, childList ,subtree}。值得注意的是:当调用 observe() 方法时,childList,attributes 或者 characterData 三个属性之中,至少有一个必须为 true,否则会抛出 TypeError 异常。要停止 MutationObserver(以便不再触发它的回调方法),需要调用MutationObserver.disconnect()方法。

举个详细点的例子。一个页面我需要在它其他元素没有超过客户端高度的时候,给底部容易加以fixed布局。因为这样的话body后面就不会有空白。而内部容器是有可能实时变化的(元素插入或者删除)。这样就需要这个方法去监听变化。

       const callback = function (mutations, ob) {            for (let mutation of mutations) {                if (mutation.type === 'childList') {                  resizeHandler(); //设置属性style                }            }        };        const targetNode = document.body;        const observerOptions = {            childList: true, // 观察目标子节点的变化,是否有添加或者删除            subtree: true // 观察后代节点,默认为 false        }        const observer = new MutationObserver(callback);        observer.observe(targetNode, observerOptions);

因为监听功能很强大,如果每次记录属性变化是非常复杂的,如果胡乱使用属性监听,浏览器会卡死。这里就一般记录节点。如果你的内容操作不是通过插入节点,而是修改属性的话,这个监听就会失效了。而这里的页面一般是自己制作的,不会有什么问题。


给你代码|往期回顾:

扩展的上传与更新|给你代码

随机密码生成器|给你代码

你是否像我一样排斥Composer?|给你代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值