2011-06-02 73 views
0

我有一個頁面,左邊有一個用戶可以點擊的鏈接列表,當它們被點擊時,右邊的div會根據鏈接通過Ajax加載正確的內容。
現在我想在右側div的內容每次都改變時觸發一個函數。
在SO搜索後,我得知有Mutation Events,我用的是DOMSubtreeModified事件:當div內的內容改變時調用一個函數?

right_div.addEventListener("DOMSubtreeModified", handler, false); 

然而,當我點擊左側的鏈接,似乎handler會叫幾個時間。我希望只有在它的新內容被加載時才調用它。我怎麼能這樣做?

+1

這些事件在所有瀏覽器中都沒有得到廣泛的支持,您如何在修改內容的函數中添加回調函數? – Ibu 2011-06-02 03:59:00

+0

@lbu其實,這不是我的網站,我想寫一個用戶腳本來爲它添加一些有用的功能,而且它只需要在Chrome和Firefox中運行 – wong2 2011-06-02 04:01:43

+0

真的很難在沒有看到您的代碼的情況下提供幫助。但是,如果處理程序被多次調用,這可能意味着DOM子樹正在被修改幾次: - )...所以也許這不是你想要使用的。不能只使用回調,例如,等待readyState完成,然後激發你的函數(我認爲jQuery不是一個選項,因爲你沒有添加標籤)? – squidbe 2011-06-02 04:28:11

回答

1

DOMSubtreeModified是「的所有更改文件通知一般的事件」。您可以設置突變事件的特定突變:

  1. DOMAttrModified事件
  2. DOMCharacterDataModified事件
  3. DOMNodeInserted事件
  4. DOMNodeInsertedIntoDocument事件
  5. DOMNodeRemoved事件
  6. DOMNodeRemovedFromDocument事件

而且有以下幾種類型:

  1. DOMElementNameChanged
  2. DOMAttributeNameChanged

因此,如果您要更換節點,它可能會導致兩個(或更多)突變事件 - 一個當節點刪除,另一個更換時。還可能發送更多事件,如修改字符數據。如果你正在聽的,只有當文本內容產生了變化的情況下,嘗試DOMCharacterDataModified事件:

用戶代理必須CharacterData.dataProcessingInstruction.data已經 修改後調度此事件 ,但節點本身具有不已插入或刪除 。此事件的近端 事件目標必須是節點或 ProcessingInstruction節點。

+0

哦,我知道爲什麼它現在會被多次調用。但我不能使用'DOMCharacterDataModified',因爲它不僅僅是正確的div中的文本內容,還有其他div。 – wong2 2011-06-02 08:18:57

+0

然後我想你必須篩選事件來確定要回應哪些內容以及忽略哪些內容。 – RobG 2011-06-02 09:23:24