ZBLOG

MutationObserver 如何遍历node节点及其子节点

MutationObserver 可以通过配置 subtree: true 来监听目标节点及其所有子节点的变化。以下是具体实现方法及示例代码:


1. 基本用法:遍历所有节点

  1. const observer = new MutationObserver((mutations) => {
  2. mutations.forEach((mutation) => {
  3. // 遍历新增的节点(包括子节点)
  4. if (mutation.addedNodes.length > 0) {
  5. mutation.addedNodes.forEach((node) => {
  6. console.log('当前节点:', node);
  7. // 递归遍历子节点(如果需要深度操作)
  8. if (node.nodeType === Node.ELEMENT_NODE) {
  9. const allChildren = node.querySelectorAll('*');
  10. allChildren.forEach(child => {
  11. console.log('子节点:', child);
  12. });
  13. }
  14. });
  15. }
  16. });
  17. });
  18. // 配置:监听子节点变化(subtree: true)
  19. observer.observe(document.body, {
  20. childList: true, // 监听直接子节点变化
  21. subtree: true // 监听所有后代节点变化
  22. });

2. 关键参数说明

参数 作用
childList: true 监听目标节点的直接子节点增删。
subtree: true 递归监听所有后代节点(包括深层嵌套的子节点)。
attributes: true 监听属性变化(需结合 attributeFilter 过滤特定属性)。

3. 实际应用场景

场景1:动态加载的脚本拦截

  1. observer.observe(document.head, {
  2. childList: true,
  3. subtree: true
  4. });
  5. // Mutation回调中检测动态插入的<script>
  6. if (node.tagName === 'SCRIPT') {
  7. console.log('拦截到脚本:', node.src);
  8. }

场景2:监控DOM树的全量变化

  1. // 打印所有新增的元素及其子元素
  2. const observer = new MutationObserver((mutations) => {
  3. mutations.forEach((mutation) => {
  4. mutation.addedNodes.forEach((node) => {
  5. if (node.nodeType === Node.ELEMENT_NODE) {
  6. console.log('新增元素:', node.outerHTML);
  7. }
  8. });
  9. });
  10. });
  11. observer.observe(document.documentElement, {
  12. childList: true,
  13. subtree: true
  14. });

4. 性能优化建议

  • 限制监听范围:避免对 document 全量监听,改为特定容器(如 document.getElementById('app'))。
  • 防抖处理:高频DOM操作时合并回调逻辑。
  • 及时断开:不需要时调用 observer.disconnect()

5. 注意事项

  • Shadow DOM:默认无法监听到 Shadow DOM内部的变化,需单独监听宿主元素。
  • 文本节点:通过 node.nodeType === Node.TEXT_NODE 过滤文本变更。

通过合理配置 subtree: true,可以高效地监控整个DOM树的动态变化。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23200

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?