2011-07-05 32 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

相关问题