2011-07-05 63 views
5

我想在這樣的元素註冊事件:如何在尚不存在的元素上註冊事件?

$(document).ready(function() { 
    $('.classname').change(function(){ 
     alert ('This line is never triggered'); 
    }); 
}); 

但問題是,.classname元素以後加載到阿賈克斯的DOM。那麼,在這種情況下,我如何正確地註冊一個事件呢?是否有可能(?不是新出現的元素,每次我的意思是,)

回答

5

繼答案建議你使用live(),它也可以使用delegate(),例如:

$('form').delegate('.classname', 'change', function(){ 
    alert("This will alert when the newly-added element registers a 'change' event."); 
}); 

對於delegate元素的選擇(.classname')分配,在這種情況下,$('form')在分配時必須存在於DOM中


編輯需要注意的是以下部分(以下接下來的「編輯」,直到「參考」)是錯誤

JS Fiddle demo

delegate()選擇器和目標到其中事件是delegate() -d 選擇的元件之間的元件上調用stopPropagation()確實有所預見的(之前雖然我沒有意識到這一點)防止委託的發生。

編輯響應質疑,在註釋中,從OP:

嘿,剛剛注意到,如果任何父的事件處理程序調用stopPropagation,然後現場活動將停止!它是否正確?

不按照jQueryAPI(條目被鏈接到下圖):由.delegate()處理

......活動將一直傳播到元素它們所委派。 ..

我還沒有嘗試/驗證了這一點尚未,但似乎即使該目標元素($('.classname'))和delegate() -d元素($('form'))之間的坐鎮元話費stopPropagation()它不該」對delegate()有不利影響。

參考:

+0

+1:不錯的選擇:o) –

+0

爲什麼,謝謝你親切! =) –

+0

嘿,剛剛注意到,如果任何父母的事件處理程序調用stopPropagation,那麼現場活動將停止!它是否正確? – Dziamid

14

必須使用on()活(做一次)被棄用:

$(document).ready(function() { 
    $(document).on('change', '.classname', function(){ 
     alert ('This line is never triggered'); 
    }); 
}); 
+0

現場看起來非常酷。非常有趣的jquery人能夠如何實現它:「事件冒起來,直到它到達樹的根,這是.live()默認綁定其特殊處理程序的地方。」謝謝我不知道這件事,我一直在做每個Ajax調用後的綁定! – mikey

+0

'live()'現在已被棄用。使用'on()'。 看到這個答案:http://stackoverflow.com/a/8191450/1738090 – w3bshark

+0

@ Tycon712是的這是一箇舊的答案,更新它 –

2

使用live結合該事件現在和將來的所有元素:

$(document).ready(function() { 
    $('.classname').live('change',function(){ 
     alert ('This line is never triggered'); 
    }); 
}); 

富勒更多信息,看看在documentation here

相關問題