2010-08-02 78 views
32

可以說我有下面的代碼返回一個頁面上的錨元素的個數:如何檢測jQuery中的新元素創建?

function getLinkCount() { 
    alert("Links:" + $("a").length); 
} 

如果我呼籲在文件準備好預期它會工作。但是,如果現在通過JavaScript動態地將新鏈接插入到頁面中,我怎麼能得到通知再次運行鏈接計數器函數? (我無法控制可以創建新鏈接的腳本)。

基本上我尋找類似的東西live()只將關注元素創建活動,是這樣的:

$("a").live("create", getLinkCount); 

創建一個新的元素時,將觸發。

回答

21

可以使用.livequery() plugin對於這一點,它運行的每一個元素,包括新的,就像這樣:

$("a").livequery(getLinkCount); 

然而,這個插件外的日期和不建議的當前版本jQuery的。

它通常是容易當你雖然創建的元素,如果你的AJAX請求之後做要做到這一點,例如,.ajaxComplete() handler可能是一個不錯的地方,例如:

$(document).ajaxComplete(getLinkCount); 

這將運行每次請求之後,並且由於您通常在您的success處理程序中創建元素,所以在完成處理程序運行時它們已經存在。

+0

ajaxComplete是一個奇妙的解決方案。謝謝! – thatmiddleway 2012-07-16 18:21:35

+2

.livequery()插件不再存在。我正在尋找一個新的解決方案 – 2013-07-19 13:48:04

+0

@MarcoPanichi您是否需要真正檢測何時添加元素,或者您只希望這些事件適用於所有事情?在這種情況下,委託樣式'.on()'就是你所追求的。 – 2013-07-19 16:43:06

42

您可以使用DOMSubtreeModified事件。例如:

$(document).bind('DOMSubtreeModified',function(){ 
    console.log("now there are " + $('a').length + " links on this page."); 
}) 
+5

它在Internet Exploder上工作嗎? – 2010-08-02 02:02:44

+2

好主意。可能我甚至可以使用DOMNodeInserted事件,它具有作爲目標插入的實際元素,因此我可以在運行方法之前檢查它是否是錨點。 – serg 2010-08-02 02:03:29

+1

@Mark Yup在IE中不起作用... – serg 2010-08-02 02:05:33

4

您可以使用我的確切同樣的目的開發的arrive.js庫(它使用MutationObserver內部)。用法:

document.arrive('a', function(){ 
    // 'this' refers to the newly created element 
    var newElem = this; 
});