• MutationObserver详解


    MutationObserver API 让我们能监听 DOM 树变化,该 API 设计用来替换掉在 DOM 3 事件规范中引入的 Mutation events。

    Mutation events 是同步触发的,每次变动都会触发一次调用。 MutationObserver API 是异步触发的DOM 的变动并不会马上触发,而是要等到当前所有 DOM 操作都结束才触发。所以 MutationObserver 相比 Mutation events 性能要更高。

    Mutation Observer 有以下特点:

    • 它等待所有脚本任务完成后,才会运行(即异步触发方式)。
    • 它把 DOM 变动记录封装成一个数组进行处理,而不是一条条个别处理 DOM 变动。
    • 它既可以观察 DOM 的所有类型变动,也可以指定只观察某一类变动。

    1. // 某个需要被监控的 dom 元素。
    2. var targetNode = document.getElementById('testId');
    3. //配置 dom 的哪些改变会触发回调函数,详细见下文表格。
    4. var config= { attributes: true, attributeFilter:['offsetTop'] };
    5. // dom 变化时触发的回调函数,传入 mutationsList:记录 dom 变化的对象数组。
    6. var callback = function(mutationsList) {
    7. // Use traditional 'for loops' for IE 11
    8. for (let mutation of mutationsList) {
    9. if (mutation.type === "childList") {
    10. console.log("A child node has been added or removed.");
    11. } else if (mutation.type === "attributes" && mutation.attributeName === 'offsetTop') {
    12. console.log("The " + mutation.offsetTop + " attribute was modified.");
    13. }
    14. }
    15. };
    16. // 创建一个 MutationObserver 示例,传入回调函数
    17. var observer = new MutationObserver(callback);
    18. // 注册监控的节点、监控的事件
    19. observer.observe(targetNode, config);
    20. // 停止监控
    21. observer.disconnect();

     mutationObserverInitConfig  配置对象如下:

    • childList:Bolean,子节点的变动(指新增,删除或者更改)。
    • attributes:Bolean,属性的变动。
    • characterData:Bolean,节点内容或节点文本的变动。
    • subtree:Bolean,表示是否将该观察器应用于该节点的所有后代节点。
    • attributeOldValue:Bolean,表示观察attributes变动时,是否需要记录变动前的属性值。
    • characterDataOldValue:Bolean,表示观察characterData变动时,是否需要记录变动前的值。
    • attributeFilter:Array,表示需要观察的特定属性(比如[‘class’,‘src’,‘offsetTop’])。
       

    应用场景:

    检测DOM变化并做出响应
    比如使用MutationObserver实现图片懒加载,监视img标签的visibilitychange事件,做出响

    应;或者当元素的偏移top在窗口内时做出加载图片操作

    动态样式变化
    监听style或者class的变化做出响应,比如我之前的应用:监听antd的模态窗变化,做出后续操作

    标签之间通信
    通过监听data-key属性的变化发送、接收消息

  • 相关阅读:
    带你深入了解Redis 高级特性
    音频数据如果在中断中会随机给的那就放入队列或者缓冲区;队列缓冲区对音频的作用
    2022强网拟态pwn-webheap
    七大排序算法——快速排序
    docker实战学习2022版本(六)之Dockerfile整合微服务实战
    springboot集成kafka消费手动启动停止
    大龄转行当程序员:只能选择小众技术,避免与年轻人竞争?
    猿创征文|基于SSM框架+java+maven+jsp的小项目
    动态类型语言和静态类型语言的区别
    oracle框架
  • 原文地址:https://blog.csdn.net/Mr_linjw/article/details/134049422