2016-05-05 115 views
1

只要創建了e,我就想使用$(e).append()JQuery在創建後追加到父項

我知道我可以使用:setTimeout(/*func checking if parent exists*/, 100)但我覺得這是一個非常糟糕的主意。是否有某種DOM事件,當DOM元素的子樹被修改時觸發?

我通常只是將它粘貼到源代碼中,然後將其粘貼到創建父項的函數中,但這不是真的可能,部分原因是我實際上正在製作Chrome擴展程序。存在Arrive.js

// watch for creation of an element which satisfies the selector ".test-elem" 
$(document).arrive(".test-elem", function() { 
    // 'this' refers to the newly created element 
    var $newElem = $(this); 
}); 

// the above event would watch for creation of element in whole document 
// it's better to be more specific whenever possible, for example 
$(".container-1").arrive(".test-elem", function() { 
    var $newElem = $(this); 
}); 

感謝您的幫助

+0

是「E」時,所有的頁面負載產生的?如果你可以做$(window).load(function(){ .... }) – Grommy

+0

你可以在父項上使用一個突變觀察者,所有東西都被附加到:https://developer.mozilla.org/en/docs/Web/API/MutationObserver –

+0

@Grommy否它是動態創建的,取決於ajax結果 –

回答

1

我會用這個庫等元素正如你可以看到它真的很容易使用。如果您不想使用外部庫,您需要查看JS中的MutationObserver,因爲DOMNodeInserted已折舊。

解除綁定庫很容易如圖文檔:

// unbind all arrive events on document element 
$(document).unbindArrive(); 

// unbind all arrive events on document element which are watching for ".test-elem" selector 
$(document).unbindArrive(".test-elem"); 

// unbind only a specific callback 
$(document).unbindArrive(callbackFunc); 

// unbind only a specific callback on ".test-elem" selector 
$(document).unbindArrive(".test-elem", callbackFunc); 

// unbind all arrive events 
Arrive.unbindAllArrive(); 
+0

嗯,這很有趣,我會在一秒內測試它 –

+0

我想我正在做一些像你現在這樣做的事情,現在幾年,這個圖書館解決了問題,我可以更快地繼續項目,而不是自己搞亂Mutation Observer。到達JS基於Mutation Observer,所以你有很好的支持。 – Riddell

+0

有一些問題,當我將代碼放入我的Chrome擴展腳本中時,它不起作用,但是當我將它放入Chrome調試器時,它有效嗎? –

0

如果e是一些靜態的HTML的一部分,那麼你可以使用典型:

$(document).ready(function(){ 
    //code here 
} 

如果e由動態添加你的代碼你可以使用DOMNodeInserted事件。對於這個例子起見,我認爲e<li>

$(document).on('DOMNodeInserted', 'li', function(){ 
    //code here 
});