2010-03-10 77 views
5

我正在HTML中實現樹型瀏覽器。在點擊一個節點時,我調用一個添加節點的子元素的函數。到現在爲止還挺好。我現在想要立即調用其中一個子元素的click處理程序來擴展它。我的問題是,jQuery找不到剛剛添加的子元素。當我在調試器中單步執行時,在瀏覽器呈現新元素之前,我的代碼將被調用,我猜測這是問題所在。使用jQuery無法找到動態添加的HTML元素

是否有一些事件我可以等待(類似於onload也許),標記何時可以看到新添加的HTML?或者我可以調用的方法來強制渲染更早發生?歡迎大家提出意見。

注:我後來意識到問題完全是我的錯,而不是瀏覽器或jQuery的問題。請參閱下面的答案。

+0

一些代碼將是有益的,以幫助你。 – 2010-03-10 10:48:53

+0

您可以添加一些有問題的代碼來幫助提供更具體的解決方案嗎? – deceze 2010-03-10 10:49:19

回答

1

我最終通過使用setTimeout()來延遲我的代碼,直到呈現新元素爲止。儘管如此,這並不是一個理想的解決方案,因爲我選擇的超時時間相當隨意。

我已經到底了。我調用的函數添加了HTML,通過回調異步執行。所以當我試圖找到新的HTML元素時,他們確實還沒有。我現在改變了我的代碼,所以回調也負責處理新添加的元素,所以保證它們會出現。

10

您可以使用.live() for this,鑽機你的點擊處理函數,而不是僅僅.click()這樣的:

$(document).ready(function() { 
    //instead of $(".myTreeNode").click(.... 
    $(".myTreeNode").live('click', function() { 
    //Do stuff 
    }); 
}); 

一個.click()結合事件處理程序時,它的執行發現的元素,所以新的元素穿上」沒有處理程序。 .live()而是監聽DOM級別的點擊以使其起泡,因此無論它們現在還是之後添加都無關緊要。在很多元素的情況下,對於每個元素,您還有事件處理程序,而不是1個,在幾個元素之後,這也變得更加高效。

+0

我試過了,但沒有解決。問題在於新添加的HTML似乎無法在jQuery查找之前訪問,直到它被呈現,並且這仍然是未來。 – 2010-03-10 16:58:02

+0

@Charles - 除了綁定點擊事件之外,你還在做些什麼嗎?如果你想讓它更加本地化,​​點擊應該由'live()'或'.delegate()'處理。 – 2010-03-10 17:20:08

2

「活」被廢棄了,因爲jQuery的1.7+這樣試試這個,

$(document).on("click","#Cancel" , function(){ 
//do something 
}); 

訪問http://api.jquery.com/on/以獲取更多信息