繁体   English   中英

removeEventListener在IE10中不起作用,在Chrome中工作

[英]removeEventListener not working in IE10, works in Chrome

我正在尝试使用MutationObserver创建一个迷你库,以检测DOM中的更改,还可以回退到旧版浏览器中的基本Mutation事件。 到目前为止,它很好,它可以在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/

谢谢你的帮助!

设法解决它:

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

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更改是否会起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM