监听DOM操作事件

DOMNodeInserted 和 DOMNodeRemoved 事件

在DOM中可以通过DOMNodeInserted和DOMNodeRemoved这两个事件来监视DOM元素的插入和移除。但由于各浏览器中DOM树的处理方式不同,导致了这两个事件在各个浏览器上都有各自的特点。只要知道了这些特定,使用时做特殊处理就能暂时解决问题。

以下测试是在文档对象上绑定这两个事件(它们是会冒泡的),并通执行一系列DOM树的操作:

<script>
addEventListener("DOMContentLoaded",function(){
document.addEventListener("DOMNodeInserted",function(e) {
console.log("insert",e.target);
});
document.addEventListener("DOMNodeRemoved",function(e) {
console.log("remove",e.target);
});
var div=document.createElement("div");
div.innerHTML="<span>span</span>";
console.log("%cinnerHTML","color:red");
document.body.innerHTML="<div><span>span</span></div>text";
console.log("%cinsertAdjacentHTML","color:red");
document.body.insertAdjacentHTML("beforeend","<div>div</div>");
console.log("%cappendChild","color:red");
document.body.appendChild(div);
document.body.appendChild(div); //重复调用 appendChild
console.log("%cremoveChild","color:blue");
document.body.removeChild(div);
console.log("%cinnerHTML","color:blue");
document.body.innerHTML="";
});
</script> 

DOM操作后台输出数据

Firefox比Chrome的结果长了许多,首先在 insertAdjacentHTML 时它把已存在的元素都触发了一次 DOMNodeInserted 但,这些元素并没有触发 DOMNodeRemoved ,我觉得此处为Firefox的BUG。另外对于已经存在了的元素执行 appendChild ,即使位置相同Firefox也会先移除这个元素在插入这个元素,所以 DOMNodeInserted 和 DOMNodeRemoved 事件都会被触发,而Chrome上优化掉了这个操作,所以事件没有触发(我觉得这方面Firefox的行为比较正确)。

Firefox下得数据输出

接下来是IE上的执行结果,这里使用了IE11上的IE9模式测试:
由于IE不支持控制台的“%c”命令,所以输出结果有点难看,不过还是能看懂的。IE对 insertAdjacentHTML 的处理同Chrome,对 appendChild 的处理同Firefox,这些处理我很赞同。但是IE会对插入元素的后代节点都触发一次 DOMNodeInserted ,我觉得这是不对的,或者说是IE的BUG吧。

总之这两个事件在Chrome、Firefox、IE上都有各自的问题,使用时需要做一些特殊判断来处理。最后也希望浏览器本身能早日统一这些东西吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值