2013-02-21 143 views
-1

我遇到了使用ajax生成的選擇器的問題。無法選擇jQuery ajax返回元素

基本上我有一個默認狀態的開始按鈕。 onclick,它啓動一些東西,然後點擊也會帶來一個帶有結果的ajax調用的新div。其中一個項目是停止按鈕。 從主網頁我的鏈接的腳本有附加到此停止按鈕

<a id="stop">stop</a> 

如果我把劇本在線點擊事件,在返回調用它自己,也打印了錨,我可以

訪問
$('#stop').click(function() { }); 

但是,我不希望腳本在那裏(因爲每頁有多個項目,並且它在主鏈接資源中有更多意義)。如果此呼叫位於主頁面的鏈接表中,則不會發生任何情況。

這是爲什麼?

是否有另一個'文檔準備'包裝我應該用來解決返回元素?

回答

2

如果

<div id="container"></div> 

是要追加的ajax調用的結果給該元素,

你想做的事:

$('#container').on('click', '#stop', function() { console.log('test'); }); 

或者你可以做類似

$('#stop').live('click', function(){ console.log('test'); }); 

但是我不建議如果你要在頁面上處理很多事件,因爲live每次使用時都會增加開銷。

+0

2年後回顧這個問題,看看你做錯了什麼總是很有趣。當然現在使用靜態父母上的委託事件:)由於這是最「正確」的方式,因此將我的答案轉換爲此。IMO – briansol 2015-07-09 15:51:21

-2

您的主腳本不會將事件添加到您的新元素,因爲它是在元素存在之前運行的。

將它的工作創造主腳本的功能,然後簡單地指定的功能,當你添加事件 -

主要腳本

var your_function = function() { 
    // your code 
} 

那麼當你添加的格 -

$('#stop').click(your_function()); 

一個更好的解決方案是Brad M建議將事件添加到父項並處理它,因爲它起泡。

+1

您說的無法將事件添加到元素之前是正確的,但是您可以將事件添加到靜態父元素(如文檔)。 jQuery有一些技巧來自動處理這些情況。至於setInterval的東西,雖然這在技術上會起作用,但它是一個解決方案的絕對黑客。在插入DOM之後,您始終可以重新附加事件處理程序,但在執行此操作時沒有同步問題。 – 2013-02-21 15:04:29

+1

更不用說,對於所有繼續附加到按鈕的事件處理程序,只需單擊一次按鈕即可執行相同數量的處理程序。 – 2013-02-21 15:08:20

+0

是的,我想我會刪除該建議。 – 2013-02-21 15:19:03

2

我對您的問題的理解是,您創建的點擊事件不會觸發通過ajax添加的元素。將處理程序附加到元素的單擊事件時,僅針對當前處於DOM中的那些元素。你有幾個選擇來獲得你想要的行爲。

1)使用效率低下的「活」處理程序。(通常以毫秒爲單位測量效率低下)

$('#stop').live('click', function(){}); 

2)將元素插入到DOM後,重新附加事件處理程序。

$.ajax({ 
    complete: function(){ 
     $('#idOfTheElementsYouJustInserted').click(function(){}); 
    } 
}); 

3)附加的事件處理程序的靜態父元素,使得按鈕被點擊時,事件「氣泡」上升並觸發該事件。要引用創建氣泡的元素,可以使用event.target,其中event是傳遞給函數的默認參數。

$('#staticParentElement').click(function(event) { var elementClicked = event.target; }); 
+1

嗯,我正在學習。從我+1。 – 2013-02-21 15:20:06

+0

你能詳細解釋一下#2嗎?這是一個HEAVY頁面,所以#1聽起來像是一個不行。 #3似乎也可能是一個問題,因爲這個元素中有多個a(它的一個ul列表) – briansol 2013-02-21 19:38:03

+1

#2是你開始的(你已經將它包含在你的問題中,並聲明它不是你想要的)。去#3。這很好。你只需要一個檢查來確認'event.target'是你的'#stop'元素。 – 2013-02-22 14:26:12