我正在尝试使用MutationObserver创建一个小型库来检测DOM中的变化,但也会回到旧浏览器中的基本突变事件。到目前为止,它在Chrome和Firefox中运行良好,我也在这些浏览器中测试了回退--一切正常,但是当我测试它IE 10时,它的行为是不同的(多么出乎意料.)
在这个库中,您可以简单地调用:
domWatch(someDOMNode, callback)回调得到一个参数--一个具有断开和观察方法的观察者,这样您就可以在对节点进行一些更改时停止监视它,然后再开始观察。
domWatch(document.querySelector('div'), function (obs) {
setTimeout(function () {
obs.disconnect();
$(obs.node).append('a');
obs.observe();
}, 1200);
});在回退中,我使用突变事件和添加/删除事件侦听器。我认为问题在于,在IE中,事件并没有真正被删除,而是被困在无限循环中(我的代码在setTimeout中,因此不会使浏览器崩溃)。出于某种原因,它可能认为this.realCallback是不同的功能?
FallbackObserver.prototype.observe = function () {
this.node.addEventListener("DOMSubtreeModified", this.realCallback, true);
}
FallbackObserver.prototype.disconnect = function () {
this.node.removeEventListener("DOMSubtreeModified", this.realCallback, true);
}我只使用有问题的代码创建了一个小小提琴,尝试在Chrome中运行,然后在IE10:http://jsfiddle.net/Hb45w/2/中运行
(全库Fiddle:http://jsfiddle.net/x6W3p/)
发布于 2014-07-12 00:28:08
设法解决了这个问题:
所有浏览器都正确地删除和添加了事件--这是另一个问题。
IE的实际问题可能是呈现引擎的某些方面--我断开了事件处理程序的连接,进行了更改,并开始再次观察:
obs.disconnect();
$(obs.node).append('a');
obs.observe();问题是,在 IE完成呈现(可能是异步执行)之前,事件显然是附加回的。
改变
FallbackObserver.prototype.observe = function () {
this.node.addEventListener("DOMSubtreeModified", this.realCallback, true);
}至
FallbackObserver.prototype.observe = function () {
var that = this;
setTimeout(function () {
that.node.addEventListener("DOMSubtreeModified", that.realCallback, true);
}, 0);
}成功了。但是,我不确定如果执行一些更复杂的DOM更改,它是否会起作用。
https://stackoverflow.com/questions/24706907
复制相似问题