深入理解DOM事件类型系列第三篇——变动事件

前面的话
变动(mutation)事件能在DOM中的某一部分发生变化时给出提示,这类事件非常有用,但都只能使用DOM2级事件处理程序,且由于浏览器兼容性不好,所以用的不广泛
删除节点
删除节点时,涉及到DOMNodeRemoved、DOMNodeRemovedFromDocument和DOMSubtreeModified这三个事件,下面将详细介绍
DOMNodeRemoved
在使用removeChild()或replacechild()从DOM中删除节点时,会触发DOMNodeRemoved事件。而event.relatedNode属性中包含着对目标节点父节点的引用。在这个事件触发时,节点尚未从其父节点删除,因此其parentNode属性仍然指向父节点。该事件会冒泡
[注意]IE8-浏览器不支持
<div id="box" style="height: 30px;width: 100px;"> <div id="inBox">1</div> </div> <button id="btn">删除子节点</button> <script> inBox.addEventListener('DOMNodeRemoved',function(e){ e = e || event; e.relatedNode.style.background = 'lightblue'; }); btn.onclick = function(){ box.removeChild(inBox); } </script>
DOMNodeRemovedFromDocument
如果被移除的节点包含子节点,那么在其所有子节点以及这个被移除的节点上会相继触发DOMNodeRemovedFromDocument事件,这个事件不会冒泡,目标target指向被移除的节点
[注意]该事件只有chrome/safari/opera浏览器支持
<div id="box" style="height: 30px;width: 100px;"> <div id="inBox">1</div> </div> <button id="btn">删除子节点</button> <script> inBox.addEventListener('DOMNodeRemovedFromDocument',function(e){ e = e || event; console.log(e.target.innerHTML)//1 }); btn.onclick = function(){ box.removeChild(inBox); } </script>
DOMSubtreeModified
在DOM结构中发生任何变化时都会触发DOMSubtreeModified事件,该事件在其他任何事件触发后都会触发
该事件的目标是被移除节点的父节点
[注意]IE8-浏览器不支持
<div id="box" style="height: 30px;width: 100px;"> <div id="inBox">1</div> </div> <button id="btn">删除子节点</button> <script> box.addEventListener('DOMSubtreeModified',function(e){ e = e || event; console.log(e.type)//DOMSubtreeModified }); btn.onclick = function(){ box.removeChild(inBox); } </script>
顺序
删除节点时,事件触发的先后顺序是DOMNodeRemoved事件、DOMNodeRemovedFromDocument事件和DOMSubtreeModified事件
<div id="box" style="height: 30px;width: 100px;"> <div id="inBox">1</div> </div> <div id="result"></div> <button id="btn">删除子节点</button> <script> inBox.addEventListener('DOMNodeRemoved',handler); box.addEventListener('DOMSubtreeModified',handler); inBox.addEventListener('DOMNodeRemovedFromDocument',handler); function handler(e){ e = e || event; result.innerHTML += e.type + ';'; } btn.onclick = function(){ box.removeChild(inBox); } </script>
插入节点
插入节点时涉及到DOMNodeInserted事件、DOMNodeInsertedIntoDocument事件及DOMSubtreeModified事件,下面将详细介绍
DOMNodeInserted
在使用appendChild()、replaceChild()或insertBefore()向DOM中插入节点时,首先触发DOMNodeInserted事件
这个事件的目标是被插入的节点,而event.relatedNode属性中包含一个对父节点的引用
在这个事件触发时,节点已经被插入到了新的父节点中。这个事件是冒泡的,因此可以在DOM的各个层次上处理它
[注意]IE8-浏览器不支持
<div id="box" style="height: 30px;width: 100px;"> </div> <button id="btn">插入节点</button> <script> box.addEventListener('DOMNodeInserted',function(e){ e = e || event; e.relatedNode.style.background = 'lightblue'; }); btn.onclick = function(){ document.body.appendChild(box); } </script>
DOMNodeInsertedIntoDocument
在新插入的节点上面会触发DOMNodeInsertedIntoDocument事件。这个事件不冒泡,因此必须在插入节点之前为它添加这个事件处理程序。这个事件的目标是被插入的节点
[注意]该事件只有chrome/safari/opera浏览器支持
<div id="box" style="height: 30px;width: 100px;"> </div> <button id="btn">插入节点</button> <script> box.addEventListener('DOMNodeInsertedIntoDocument',function(e){ e = e || event; box.style.background = 'lightblue'; }); btn.onclick = function(){ document.body.appendChild(box); } </script>
顺序
插入节点时,事件触发的先后顺序是DOMNodeInserted事件、DOMNodeInsertedIntoDocument事件和DOMSubtreeModified事件
<div id="box" style="height: 30px;width: 100px;"> </div> <div id="outer"></div> <div id="result"></div> <button id="btn">插入子节点</button> <script> box.addEventListener('DOMNodeInserted',handler); outer.addEventListener('DOMSubtreeModified',handler); box.addEventListener('DOMNodeInsertedIntoDocument',handler); function handler(e){ e = e || event; result.innerHTML += e.type + ';'; } btn.onclick = function(){ outer.appendChild(box); } </script>
特性节点
DOMAttrmodified
当特性被修改后,DOMAttrmodified事件被触发
[注意]该事件只有firefox和IE8+浏览器支持
<div id="box" title="123" style="height: 30px;width: 100px;"></div> <button id="btn">修改特性</button> <script> box.addEventListener('DOMAttrModified',handler); function handler(e){ e = e || event; box.innerHTML = e.type; } btn.onclick = function(){ box.setAttribute('title','abc'); } </script>
文本节点
DOMCharacterDataModified
当文本节点的值发生变化时,触发DOMCharacterDataModified事件
[注意]该方法只有chrome/safari/opera浏览器支持
<div id="box" style="height: 30px;width: 100px;">abc</div> <button id="btn">修改文本</button> <script> box.addEventListener('DOMCharacterDataModified',handler); function handler(e){ e = e || event; console.log(e) box.style.background = 'pink'; } btn.onclick = function(){ box.innerHTML = '123'; } </script>
最后
上面7个变动事件,浏览器兼容性都不是太好。唯三过得去就是DOMNodeInserted、DOMNodeRemoved和DOMSubtreeModified这三个事件,不兼容IE8-浏览器
好的代码像粥一样,都是用时间熬出来的

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?