2009-08-02 17 views
6

Internet Explorer中是否存在任何事件,當DOM更改時會觸發該事件?例如:有沒有onDocumentChange事件?

document.attachEvent("ondocumentchange", function() { 
    alert("you've just changed DOM!"); 
}); 

當我執行:

document.appendChild(document.createElement("img")); 

窗口的文字 「你只是改變了DOM!」出現。

我嘗試在IE6中使用Javascript來模擬「高級」CSS選擇器(例如+,>,[attr])。但是,要正確處理動態內容,必須在每次更改文檔後重新計算它們。

回答

9

蠻力 「解決方案」:

(function (previousInnerHTML) { 
    return function() { 
     if (document.body.innerHTML !== previousInnerHTML) { 
      alert("you've just (at max 33ms ago) changed DOM"); 
     } 
     setTimout(arguments.callee, 33); 
    }; 
})(document.body.innerHTML)(); 
3

您想查看dom突變事件 - 請參閱http://en.wikipedia.org/wiki/DOM_Events,然後向下滾動到關於突變事件的部分。唯一的問題是對這些事件的支持很粗略,所以要小心使用它們。值得注意的是,在IE或Opera中缺乏支持。 Firefox,Safari和Chrome似乎是唯一的。

喜歡的東西:

document.addEventListener("DOMSubtreeModified", function() { 
    alert("you've just changed DOM!"); 
}); 

根據http://www.quirksmode.org/dom/events/index.html這些那種你需要使用的addEventListener,沒有的attachEvent事件。 事件顯然是泡沫,所以應該沒問題。

+2

「[...]缺乏支持在IE在所有[...]」 - 這就是問題所在 - 我需要因爲IE的這個事件。 – 2009-08-02 15:00:55

+0

害怕我不認爲有這樣做的方法,至少不是沒有手動遞歸通過DOM樹。你不能縮小對特定子節點的更改嗎? – Kazar 2009-08-02 19:01:25

+0

突變事件已被棄用,突變事件服務器自IE 11起可用https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver# – 2015-02-20 10:37:55

1

關閉我的頭頂,這威力工作:

document.body.attachEvent('onpropertychange', function(event) { 
    if (event.propertyName !== 'innerHTML') return; 
    alert("you've just changed DOM!"); 
}); 

這依賴於IE的專有[onPropertyChange事件](http://msdn.microsoft.com/en-us/library/ms536956(VS.85).aspx) - 因爲文檔的innerHTML會改變,每當一個節點被插入,但:

  1. 它不可能與某些類型的屬性的工作。我想innerHTML作用相當於一個「吸」,因爲它會只得到重新計算時retri eved。

  2. 這也將拿起誤報很多 - 很多其他的事情會改變innerHTML,將有無關節點插入。您可以通過傾聽特定元素而不是文檔範圍來緩解這種情況。