Javascript removeEventListener不适用于IE10,适用于Chrome

Javascript removeEventListener不适用于IE10,适用于Chrome,javascript,internet-explorer,javascript-events,mutation-observers,mutation-events,Javascript,Internet Explorer,Javascript Events,Mutation Observers,Mutation Events,我正在尝试使用MutationObserver创建一个迷你库来检测DOM中的更改,但也可以回退到旧浏览器中的基本变异事件。到目前为止还不错,它在Chrome和Firefox中正常工作,我也在这些浏览器中测试了回退功能-一切都正常,但当我测试它IE 10时,它的表现不同(多么出乎意料…) 在此库中,您只需调用: domWatch(someDOMNode, callback) callback获取一个参数-一个具有disconnect&observe方法的观察者,这样您就可以在对节点进行某些更改时

我正在尝试使用MutationObserver创建一个迷你库来检测DOM中的更改,但也可以回退到旧浏览器中的基本变异事件。到目前为止还不错,它在Chrome和Firefox中正常工作,我也在这些浏览器中测试了回退功能-一切都正常,但当我测试它IE 10时,它的表现不同(多么出乎意料…)

在此库中,您只需调用:

domWatch(someDOMNode, callback)
callback获取一个参数-一个具有disconnect&observe方法的观察者,这样您就可以在对节点进行某些更改时停止观察节点,然后重新开始观察

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中运行:

(全库小提琴:)

谢谢你的帮助

设法解决了这个问题:

所有浏览器都正确地删除和添加事件-问题在于其他方面

IE的实际问题可能是渲染引擎的某个方面-我断开了事件处理程序的连接,进行了更改并再次开始观察:

    obs.disconnect();
    $(obs.node).append('a');
    obs.observe();
问题在于事件显然是在IE完成渲染(可能是某个异步执行)之前被附加回

改变

FallbackObserver.prototype.observe = function () {
    this.node.addEventListener("DOMSubtreeModified", this.realCallback, true);
}

成功了。但如果执行一些更复杂的DOM更改,我不确定它是否会起作用

FallbackObserver.prototype.observe = function () {
    var that = this;
    setTimeout(function () {
       that.node.addEventListener("DOMSubtreeModified", that.realCallback, true);
    }, 0);
}