javascript - 为什么我的 MutationObserver 回调没有为某些新标签执行?

标签 javascript html google-chrome mutation-observers

我正在开发一个影响页面上的 GIF 图像(除其他外)的 Chrome 扩展程序。我正在努力让它在初始页面加载后动态添加新图像。这是我添加到我的内容脚本中以尝试处理这些内容的内容:

function processGif(newTag) {
  console.log(newTag.src);
}

var observer = new MutationObserver(function(mutations, obs) {
  for(var i=0; i<mutations.length; ++i) {
    for(var j=0; j<mutations[i].addedNodes.length; ++j) {
      var newTag = mutations[i].addedNodes[j];
      if(newTag.tagName == "IMG" && /.gif$/i.test(newTag.src)) {
        processGif(newTag);
      }
    }
  }
});

observer.observe(document.documentElement, {
  childList: true,
  subtree: true
});

出于测试目的,我已将 processGif 函数简化为标签的 src 属性的 console.log

大多数情况下,它工作得很好,并成功捕获了在首次加载页面时最初构建 DOM 时创建的所有初始图像。但是在像 Google+ 这样的页面上,当您向下滚动时,MutationObserver 似乎没有捕捉到任何动态加载的帖子。我一直在使用 Koushik Dutta's public page出于测试目的——这家伙喜欢张贴 gif。如果您尝试将上述代码粘贴到控制台并向下滚动,您应该能够确认没有检测到任何动态加载的图像。

为什么我看不到这些动态添加的img标签,我需要做什么来处理这样动态添加的图片?

最佳答案

我想我明白发生了什么。您通过观察者获得的 addedNodes 列表实际上并不是已添加到 DOM 中的每个节点的列表,而是一次添加多个节点时的最顶层节点。

考虑到这一点,您只需处理每个添加的节点及其所有子节点。所以观察者回调需要修改成如下所示。

observer = new MutationObserver(function(mutations, obs) {
  for(var i=0; i<mutations.length; ++i) {
    for(var j=0; j<mutations[i].addedNodes.length; ++j) {
      var newTag = mutations[i].addedNodes[j];
      if (newTag.querySelectorAll) {
        Array.prototype.forEach.call(
          newTag.querySelectorAll('img[src*=".gif"]'),
          processGif);
      }
    }
  }
});

关于javascript - 为什么我的 MutationObserver 回调没有为某些新标签执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25711476/

相关文章:

javascript - 在下拉 javascript 中显示选定的选项

javascript - 如何等待/检查元素是否存在

javascript - 什么是统计访客的最佳系统?

html - 提交按钮无边框 - 高度/对齐问题

JavaScript onmouseleave 和 onmouseenter 在 Firefox 和 IE9 中工作,但在 Chrome 中不起作用?

javascript - 离开页面后还保留dom吗?

javascript - VideoJS 音量控制 handle 第二个播放器

javascript - 'click' 上的 jQuery 在更改为 Bootstrap 表后未触发

php - 模块化站点中的上下文感知 AJAX 调用

google-chrome - 将 Google Chrome 升级到版本 63.0.3239.84 后,我开始收到错误和警告