首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >removeEventListener不工作于IE10,工作于Chrome

removeEventListener不工作于IE10,工作于Chrome
EN

Stack Overflow用户
提问于 2014-07-11 21:33:46
回答 1查看 689关注 0票数 0

我正在尝试使用MutationObserver创建一个小型库来检测DOM中的变化,但也会回到旧浏览器中的基本突变事件。到目前为止,它在Chrome和Firefox中运行良好,我也在这些浏览器中测试了回退--一切正常,但是当我测试它IE 10时,它的行为是不同的(多么出乎意料.)

在这个库中,您可以简单地调用:

代码语言:javascript
复制
domWatch(someDOMNode, callback)

回调得到一个参数--一个具有断开和观察方法的观察者,这样您就可以在对节点进行一些更改时停止监视它,然后再开始观察。

代码语言:javascript
复制
domWatch(document.querySelector('div'), function (obs) {
    setTimeout(function () {
        obs.disconnect();
        $(obs.node).append('a');
        obs.observe();
    }, 1200);
});

在回退中,我使用突变事件和添加/删除事件侦听器。我认为问题在于,在IE中,事件并没有真正被删除,而是被困在无限循环中(我的代码在setTimeout中,因此不会使浏览器崩溃)。出于某种原因,它可能认为this.realCallback是不同的功能?

代码语言:javascript
复制
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/)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-12 00:28:08

设法解决了这个问题:

所有浏览器都正确地删除和添加了事件--这是另一个问题。

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

代码语言:javascript
复制
    obs.disconnect();
    $(obs.node).append('a');
    obs.observe();

问题是,在 IE完成呈现(可能是异步执行)之前,事件显然是附加回的。

改变

代码语言:javascript
复制
FallbackObserver.prototype.observe = function () {
    this.node.addEventListener("DOMSubtreeModified", this.realCallback, true);
}

代码语言:javascript
复制
FallbackObserver.prototype.observe = function () {
    var that = this;
    setTimeout(function () {
       that.node.addEventListener("DOMSubtreeModified", that.realCallback, true);
    }, 0);
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24706907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档