• 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属性的变化发送、接收消息

  • 相关阅读:
    《Google软件工程之道》软件工程随想
    【力扣刷题】回文链表、环形链表、合并两个有序链表
    Python自动化测试selenium指定截图文件名方法
    【指针数组】【数组指针】【函数指针】【函数指针数组】【回调函数】你都会吗
    【无标题】接口测试遇到的典型bug纪录
    类和对象常见题目解法
    SpringCloud的新闻资讯项目01--- 环境搭建、SpringCloud微服务(注册发现、服务调用、网关
    视频的二维码怎么做?教你一个实用技巧操作
    责任链模式
    css 好看的边框
  • 原文地址:https://blog.csdn.net/Mr_linjw/article/details/134049422