有没有办法,如何强制变异观察者忽略由回调函数引起的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);
它似乎有效,但我担心,由于事件的异步处理,我可能会禁用观察者,当其他人做出更改并错过它们时。
不太可能有一种方法可以将更改与页面本身和回调分开,但我会尝试一下。
答案 0 :(得分:3)
如果observer
仅observe
定位,而您没有其他内容,那么您的想法就会奏效。它并不是一个特别有效的解决方案,因为每次重置observable时都必须再次设置挂钩,但它会起作用。
observer.disconnect()
_3rd_party_callback();
observer.observe(target, config);
由于主事件循环中发生的所有DOM更改,您有可能错过_3rd_party_cb
之外的任何事件导致的事件。因此,断开观察者的连接,调用第三方代码然后重新连接 - DOM之间没有任何步骤可以更改DOM。但是,如果第三方代码推迟了更改,例如setTimeout(messupthedom, 0)
您仍会在观察中发现这些变化。