簡體   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