4

有没有办法,如何强制突变观察者忽略回调函数引起的 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);

问题是, _3rd_party_callback回调导致 DOM 变化,所以它永远不会停止。顾名思义,它是第三方功能,我无法更改(实际上它的 DOM 操作是它的目的)。

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

  observer.disconnect()
  _3rd_party_callback();
  observer.observe(target, config);

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

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

4

1 回答 1

5

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

observer.disconnect()
_3rd_party_callback();
observer.observe(target, config);

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

于 2014-07-28T21:18:22.337 回答