科普一个监听DOM的对象-MutationObserver

简介: 科普一个监听DOM的对象-MutationObserver

介绍

MutationObserver给开发者们提供了一种能在某个范围内的 DOM树发生变化时作出适当反应的能力.该API设计用来替换掉在DOM3事件规范中引入的 Mutation事件.

以上这段引自权威牛逼的MDN。(懒得自己写了...)

创建MutationObserver对象

var mo = new MutationObserver(
  function callback
);

参数只有一个,就是回调函数(callback),当MutationObserver监听到目标变化时会触发这个回调。这个回调参数会被传递两个参数,第一个是包含了若干个变化目标的信息的参数,这些信息集合称为MutationRecord对象;第二个参数则是你创建的这个对象自身。

实例方法

1.observe()

// 第一个参数是要监听的DOM节点对象,第二是用于配置的对象
observe( Node, option);

其中option对象可配置是否监听目标节点的子节点、是否监听html属性/文本等,可以查看MutationObserverInit的详细介绍

2. disconnect()
停止监听。

3.takeRecords()
清空观察者对象的记录队列,并返回里面的内容

兼容性

MutationObserver兼容情况

一个例子

下面这个例子演示了如何定时插入节点并被监听到,效果点击这里可查看:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>MutationObserver demo</title>
</head>
<body>
    <div id="info" style="color:brown; font-size: 20px;">正在监听#wrap</div>
    <div id="wrap"></div>
    <script>
        var body = document.body;
        var info = document.getElementById('info');

        main();

        // 创建MutationObserver对象及其回调
        function createMutationObserverObject(){
            var MutationObserver = window.MutationObserver ||
            window.WebKitMutationObserver ||
            window.MozMutationObserver;

            if(!MutationObserver){
                info.innerHTML = '您的浏览器不支持MutationObserver对象!';
                return false;
            }
            return new MutationObserver(function(mutations) {
                mutations.forEach(function(mutation) {
                    info.innerHTML = '监听到DOM变化,新增元素的id: ' + mutation.addedNodes[0].id;
                });    
            });
        }

        // 使用MutationObserver对象的observe方法对目标节点监听
        function listen(){
            var observer = createMutationObserverObject();
            if(!observer) return;
            observer.observe(wrap, { attributes: true, childList: true});
        }

        // 定时往目标节点新增元素查看监听情况
        function main(){
            listen();
            var count = 0;
            var listenDom = setInterval(function(){
                count++;
                var p = document.createElement('p');
                p.id = 'p' + count;
                p.innerText = "我的id是 p" + count;
                wrap.appendChild(p);
                if(count>=5){
                    clearInterval(listenDom);
                    //observer.disconnect();
                }
            }, 1500)
        }
    </script>
</body>
</html>
相关文章
|
7月前
|
JavaScript 算法
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
|
7月前
|
JavaScript
vue监听dom元素的宽高变化和自定义指令监听dom元素的宽高变化
vue监听dom元素的宽高变化和自定义指令监听dom元素的宽高变化
841 0
|
2月前
|
XML 编解码 JavaScript
DOM(文档对象模型)和 BOM(浏览器对象模型)
【10月更文挑战第19天】在前端开发中,理解 DOM(文档对象模型)和 BOM(浏览器对象模型)是至关重要的。它们是 Web 开发的基础,为我们提供了与网页文档和浏览器进行交互的能力。
|
4月前
|
JavaScript 前端开发
js之DOM 文档对象模型
js之DOM 文档对象模型
29 1
js之DOM 文档对象模型
|
4月前
|
监控 JavaScript 前端开发
Vue3组合式函数(监听DOM尺寸 useResizeObserver)
本文介绍如何使用 `ResizeObserver` API 编写 Vue3 的通用组合式函数 `useResizeObserver`,该函数可方便地观察一个或多个元素的尺寸变化,并执行指定回调。`ResizeObserver` 接口用于监控 `Element` 或 `SVGElement` 的尺寸变化,避免了无限回调循环问题。
319 0
Vue3组合式函数(监听DOM尺寸 useResizeObserver)
|
4月前
|
XML JavaScript 测试技术
Web自动化测试框架(基础篇)--HTML页面元素和DOM对象
本文为Web自动化测试入门指南,介绍了HTML页面元素和DOM对象的基础知识,以及如何使用Python中的Selenium WebDriver进行元素定位、操作和等待机制,旨在帮助初学者理解Web自动化测试中的关键概念和操作技巧。
56 1
|
4月前
|
JavaScript 前端开发 API
前端开发者的救赎:揭秘JQ对象与DOM元素的神秘转换术
【8月更文挑战第23天】在Web前端开发领域,jQuery(简称JQ)作为一款流行的JavaScript库,极大简化了HTML文档遍历、事件处理、动画及Ajax交互等操作。理解和掌握jQuery对象与DOM元素间的转换至关重要。
48 0
|
4月前
|
JavaScript 前端开发
js之DOM 文档对象模型
js之DOM 文档对象模型
|
6月前
|
JavaScript 前端开发 算法
虚拟DOM是React的关键技术,它是个轻量的JS对象树,模拟实际DOM结构。
【6月更文挑战第27天】虚拟DOM是React的关键技术,它是个轻量的JS对象树,模拟实际DOM结构。当状态改变,React不直接修改DOM,而是先构建新的虚拟DOM树。通过 diff 算法比较新旧树,找到最小变更,仅更新必要部分,提高性能,避免频繁DOM操作。虚拟DOM还支持跨平台应用,如React Native。它优化了更新流程,简化开发,并提升了用户体验。
47 1
|
5月前
|
JavaScript
react18【系列实用教程】useRef —— 创建 ref 对象,获取 DOM (2024最新版)
react18【系列实用教程】useRef —— 创建 ref 对象,获取 DOM (2024最新版)
66 0