【问题标题】:How to set up MutationObserver to detect added DOM?如何设置 MutationObserver 来检测添加的 DOM?
【发布时间】:2014-11-03 14:41:09
【问题描述】:

问题:我想将 Facebook 的一些默认文本更改为我自己的。

我使用了jQuery的text(),但是问题是当用户向下滚动时Facebook会添加更多的DOM,所以我尝试使用MutationObserver来检测是否有新的DOM进来。

我在我的 chrome content_script 中试过这个:

// I need to detect new .UFILikeLink elements
var target = document.querySelector('.UFILikeLink');

var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
    alert('test');
  });    
});

var config = { attributes: true, childList: true, characterData: true };

observer.observe(target, config);

但这不起作用,alert() 没有触发。我想知道这是使用MutationObserver 的正确方法。

【问题讨论】:

  • 你想观察添加新内容的容器。
  • @dandavis 你能解释一下吗?
  • 考虑更改问题标题,它不适合问题。

标签: javascript jquery facebook dom google-chrome-extension


【解决方案1】:

“目标”不是您要过滤的元素的选择器,但它应该是代表您正在查看的子树的根的单个元素。

例如,如果您想在正文中收到所有新元素的通知,则目标应该是document.body

如果你需要过滤结果(你可能会这样做),你应该在回调中这样做。

(已删除的代码)

由于您已经在使用 jQuery,这里有一个更简洁和健壮的版本:

var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    $(mutation.addedNodes).find(".UFILikeLink").each(function() {
      /* do something */
      console.dir(this); // Note, it's a DOM element, use $(this) if needed        
    });
  });    
});

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

请注意,您需要 subtree: true 来监视文档深处的突变。

【讨论】:

  • 它似乎工作,但在这一行mutation.addedNodes.filter(function(node) { 我得到这个错误:未定义不是一个函数
  • 不断忘记各种节点集合没有适当的数组函数。片刻。
  • 是的,我试过它不起作用..它不应该那么复杂,mutationobserver是唯一的方法吗?
  • 老实说,在没有 jQuery 的情况下这样做有点痛苦。您也可以查看MutationSummary library,它会有所帮助。我编辑了答案,它会现在工作。
  • 你的意思是什么问题或答案?
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 2020-10-03
  • 2015-10-18
  • 2016-10-25
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 2017-05-21
相关资源
最近更新 更多