变异观察者 - DOM 被回调函数改变

dak*_*kov 3 javascript dom mutation-observers

有没有办法,如何强制变异观察者忽略回调函数引起的DOM变化?

现在我有:

var config = { attributes: true, childList: true, characterData: true };
var target = document.body;
var timer;

// create an observer instance
var observer = new MutationObserver(function(mutations) {

   // fired when a mutation occurs
   timer = setTimeout(function () {

      _3rd_party_callback();


   }, 500);  

});

observer.observe(target, config);
Run Code Online (Sandbox Code Playgroud)

问题在于, _3rd_party_callback回调会导致 DOM 更改,因此它永远不会停止。顾名思义,它是第三方函数,我不能改变(实际上它的 DOM 操作是它的目的)。

所以我所做的是分别在回调中调用函数之前和之后断开连接并启动观察者。

  observer.disconnect()
  _3rd_party_callback();
  observer.observe(target, config);
Run Code Online (Sandbox Code Playgroud)

它似乎有效,但我担心,由于事件的异步处理,当其他人进行更改并错过它们时,我可能会禁用观察者。

不太可能有办法将更改与页面本身和回调分开,但我会尝试一下。

meg*_*wac 5

如果observerobserve针对目标而不是其他任何东西,您的想法就会奏效。这不是一个特别有效的解决方案,因为每次重置可观察对象时都必须再次设置挂钩,但它会起作用。

observer.disconnect()
_3rd_party_callback();
observer.observe(target, config);
Run Code Online (Sandbox Code Playgroud)

_3rd_party_cb由于主事件循环中发生的所有 DOM 更改,您将错过由任何事件引起的事件的可能性为 0 。因此,您断开观察者的连接,调用第 3 方代码,然后重新连接它 --- DOM 更改之间没有任何步骤。但是,如果第 3 方代码推迟更改,例如,setTimeout(messupthedom, 0)您仍然会在您的 observable 中获取这些更改。