[JS每M日N练] 监听DOM内容改变的各种方案

导读

应用场景

  • 不修改源码的情况下定制一些第三方组件
  • 性能分析
  • 逆向分析

addEventListener

关于这个API不要查看菜鸟教程中的解释,直接看MDN

示例

对于DOMNodeInserted事件,我们只需要知道使用函数document.addEventListener传递第一个参数为字符串DOMNodeInserted,第二个参数为事件处理函数

事件处理函数的第一个参数为事件对象,其中属性target为被插入的对象,根据该对象的各种属性,我们执行我们的各种操作(禁用、删除、增加等等)。

	var div = document.createElement("div"),
	container =document.getElementById("content"),
	loading =document.getElementById("loading");
	document.addEventListener("DOMNodeInserted",function(e){
		// 被插入的对象
		var node = e.target;
		if(node.parentNode.id==="content"){
			alert("即将移除loading层");
			container.removeChild(loading);
		}
	});
	div.innerHTML = "新插入的内容";
	container.appendChild(div);

MutationObserver

直接参考MDN https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver
或者参考文章:《javascript 监听DOM内容改变事件》 https://juejin.cn/post/7025877062430752775,注释很详细。

示例

    // 选择将观察突变的节点
    var targetNode = document.getElementById('el-test');

    // 观察者的选项(要观察哪些突变)
    var config = { attributes: true, childList: true, subtree: true };

    // 当观察到突变时执行的回调函数
    var callback = function(mutationsList) {
        mutationsList.forEach(function(item,index){
            if (item.type == 'childList') {
                console.log('有节点发生改变,当前节点的内容是:');
                console.log(item.target.innerHTML);
            } else if (item.type == 'attributes') {
                console.log('修改了'+item.attributeName+'属性');
            }
        });
    };

    // 创建一个链接到回调函数的观察者实例
    var observer = new MutationObserver(callback);

    // 开始观察已配置突变的目标节点
    observer.observe(targetNode, config);

    // 停止观察
    //observer.disconnect();

效果如下图:
在这里插入图片描述

在这里插入图片描述

Chrome调试工具实现DOM监控

dev-tool操作说明

我们可以设置三种断点
  • subtree modifications 子节点内容的的修改删除新增(子节点的属性修改不会触发,当前节点的修改不会触发)
  • attribute modifications 当前节点的属性修改删除新增
  • node removal 当前节点被移除
    在这里插入图片描述
当我们的脚本触发了DOM的修改时,devtools会直接跳转到Source页签并定位到修改DOM的那行代码上

在这里插入图片描述

断点管理

同时我们还可以通过debugger模块来管理所有的DOM断点,
可以看到所有的DOM断点,以及他们所监听的类型,
也可以进行一键删除之类的操作。
在这里插入图片描述

dev-tool设置条件断点

通过js设置监听后,我们会接收到大量信息,如何快速定位到我们想要的信息,就需要用到条件断点了。
这里之所以专门提到条件断点,是因为它跟windows常见调试工具(ollydbg、x64dbg等)设置条件断点方式不太一样,不能在Breakpoints面板内下断点,需要到相应的代码处,右键行号进行断点设置。
在这里插入图片描述

详细步骤可以参考文章《Chrome设置断点的各种姿势》 https://cloud.tencent.com/developer/article/1093731

文章小结

addEventListener是W3C的API,历史遗留接口,很多问题,整体来说不推荐使用

MutationObserver是H5的API,从设计和兼容性上都要好的多,如果在开发中,使用该api更合适。

不过在Chrome测试中发现,addEventListener有些状态监控不到,MutationObserver可以弥补这种情况。而MutationObserver像是消息队列的实现方式,不能查看运行时堆栈。所以开发过程中根据需要使用不同的api,也可以同时使用两套api达到目的。

参考资料

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜猫逐梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值