一个MutationObserver对象可以观察多个目标吗?

时间:2015-06-12 16:21:25

标签: javascript html dom mutation-observers

我想使用MutationObserver对象来观察我的一些DOM节点的变化。

文档提供了创建MutationObserver对象并在目标上注册它的示例。

// 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);

假设我有上面的代码,但就在它下面,我放置了这段代码:

var target2 = document.querySelector('#some-other-id');
var config2 = {attributes: true, subtree: true};
observer.observe(target2, config2);

observer

  • 现在正在观察2个目标?
  • 是否会停止观察target
  • 是否会决定不遵守target2
  • 会抛出错误吗?
  • 还是会表现出其他一些行为?

1 个答案:

答案 0 :(得分:25)

观察者现在将根据您的定义观察两个目标 - targettarget2。不会抛出任何错误,target将不会被注销"支持target2。不会出现意外或其他行为。

这是一个在两个特定元素上使用相同MutationObserver的示例。要查看此内容,请从每个<span>元素中删除contenteditable节点,并查看两个观察元素的行为范围。

<div id="myTextArea" contenteditable="true">
    <span contenteditable="false">Span A</span>
</div>

<div id="myTextArea2" contenteditable="true">
    <span contenteditable="false">Span B</span>
</div>
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
      //console.log($(mutation.removedNodes)); // <<-- includes text nodes

      $(mutation.removedNodes).each(function(value, index) {
          if(this.nodeType === 1) {
              console.log(this)
          }
      });
  });
});

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

observer.observe($('#myTextArea')[0], config);

observer.observe($('#myTextArea2')[0], config);

JSFiddle Link - 演示

请注意,我已为此第一个演示回收了相同的配置,但是,放置一个新配置将是该观察元素所独有的。以config2中定义的示例为例,如果在#myTextArea2上使用,则根据配置选项,您不会看到记录的节点,但请注意#myTextArea的观察者不受影响。

JSFiddle Link - 演示 - 配置排他性