对 MutationObserver 感到困惑

Posted

技术标签:

【中文标题】对 MutationObserver 感到困惑【英文标题】:Confused About MutationObserver 【发布时间】:2013-05-13 06:07:51 【问题描述】:

所以我一直在为使用 MutationObserver 而烦恼,但我没有取得任何进展。我已经在 W3C 网站和 MDN 上阅读过它。在 MDN 中阅读它时,在示例之前一切都很有意义。

// select the target node
var target = document.querySelector('#some-id');

// create an observer instance
var observer = new MutationObserver(function(mutations) 
  mutations.forEach(function(mutation) 
    console.log(mutation.type);
  );   
);

// configuration of the observer:
var config =  attributes: true, childList: true, characterData: true ;

// pass in the target node, as well as the observer options
observer.observe(target, config);

// later, you can stop observing
observer.disconnect();

我最麻烦的部分是创建观察者实例,不确定属于那里的语法。同样在控制台中,我收到了“TypeError:Value 未实现接口节点”。 无论我查看并尝试使用哪些示例;将示例中的选择器替换为所需的 jQuery 选择器(非 jQ 选择器也会返回相同的问题)。

【问题讨论】:

MutationObserver 与 jQuery 相关。查询选择器可能看起来类似于 sizzle,但它们不共享一个实现。 你有id为“some-id”的元素吗? @Frits van Campen 我知道它们不相关,我正在使用 jQ 库,但是无论我是否使用 jQ 选择器,我都会收到 TypeError 消息。 @bfavaretto 我说我已经用必要的选择器替换了选择器并且仍然收到消息。 该错误表明您没有将有效的 DOM 节点传递给 observer.observe。如果您解决了这个问题(例如,仅在加载 DOM 时运行该代码),代码就可以工作(您也必须删除 disconnect 部分,因为它会删除观察者)。演示:jsfiddle.net/SdFeR 【参考方案1】:

首先你绝对不应该使用 jQ 选择器,因为它们不是 Node 元素。 其次,您必须确保查询选择器返回不为空。 为了确保第一次尝试在 document.body 上观察:它绝对是一个 Node 对象。 类似的东西

(
    new MutationObserver(function(mutationEventList)
        console.log(mutationEventList)
    )
)
.observe(document.body, 
    childList: true,
    attributes: true,
    characterData: true
)

当您熟悉以观察者为目标并了解 MutationObserverInit 选项值(它们被描述得不够好)时,您将能够正确使用 mutationObserver。

【讨论】:

是否可以通过MutationObserver 观察 的变化??【参考方案2】:

MutationObserver 是一个非常强大的功能,可让您监控 DOM 中节点/对象的所有类型的更改。在他们的示例中,他们在这里创建了观察者:

// create an observer instance
var observer = new MutationObserver(function(mutations) 
  mutations.forEach(function(mutation) 
    console.log(mutation.type);
  );   
);

在这里调用它:

// pass in the target node, as well as the observer options
observer.observe(target, config);

目标是一个节点,配置告诉它在该节点上监控什么。您可以监控各种事物,在他们的示例中,它们正在监控 attributeschildListcharacterData 发生变化的时间。如果这些项目中的任何一项由于 javascript 操作或用户操作而发生更改,observer 将触发并为您提供有关更改内容的信息,并让您根据更改类型采取措施。在控制台中最容易看到它发生。

要进行测试,请确保您选择了一个有效的目标:

// select the target node
var target = document.querySelector('#some-id');

【讨论】:

是否可以通过MutationObserver 观察 的变化?? “”是指函数吗?如果是这样,答案是否定的。 MutationObserver 用于监控 DOM 变化。 MutationObserver 仅用于监控 DOM 变化。对象内部的更改将是一种事件侦听器。【参考方案3】:

简单的 MutationObserver:

<div contentEditable id="myID">EDIT TO FIRE</div>
<script>
let x = new MutationObserver(   function() alert('FIRED');    );
x.observe(  myID , subtree:true, characterData:true  );
</script>

观看直播:https://jsfiddle.net/bg8k0jmy/

【讨论】:

以上是关于对 MutationObserver 感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

对 Python 列表语法感到困惑

对JAVA界面感到困惑[重复]

对令牌感到困惑

对 gprof 输出感到困惑——调用太多?

对减少和箭头功能感到困惑[重复]

对反应模式/架构感到困惑