jQuery .live()与.on()方法在加载dynamichtml之后添加一个click事件

我正在使用jQuery v.1.7.1,其中的.live()方法显然已被弃用。

我遇到的问题是,当dynamic加载html元素使用:

$('#parent').load("http://..."); 

如果之后尝试添加一个点击事件,则不会使用以下任一方法注册事件:

 $('#parent').click(function() ...); 

要么

 // according to documentation this should be used instead of .live() $('#child').on('click', function() ...); 

什么是实现这个function的正确方法? 它似乎只为我工作.live(),但我不应该使用该方法。 请注意#child是一个dynamic加载的元素。

谢谢。

如果你想让click处理器为一个被dynamic加载的元素工作,那么你可以在一个父对象上设置事件处理器(它不会被dynamic加载),并给它一个与你的dynamic对象相匹配的select器:

 $('#parent').on("click", "#child", function() {}); 

事件处理程序将被附加到#parent对象,并且随时点击事件冒泡到它在#child上产生的#child ,它将触发你的点击处理程序。 这被称为委托事件处理(事件处理委托给父对象)。

这样做是因为您可以将事件附加到#parent对象,即使#child对象还不存在,但是当它稍后存在并被点击时,click事件会冒泡到#parent对象,它会看到它来自#child并且有一个事件处理程序用于点击#child#child你的事件。

尝试这个:

 $('#parent').on('click', '#child', function() { // Code }); 

$.on()文档:

事件处理程序仅绑定到当前选定的元素; 它们必须在代码调用.on()时存在于页面上。

当你调用$.on()时,你的#child元素不存在,所以事件没有被绑定(不像$.live() )。 但是, #parent 确实存在,所以绑定事件就没有问题。

我上面的代码中的第二个参数作为一个“filter”,只有当事件从#child冒泡到#parent才会触发。

$(document).on('click', '#selector', function() { /* do stuff */ });

编辑:我提供了更多的信息,这是如何工作的,因为…单词。 在这个例子中,你要在整个文档上放置一个监听器。

当你click任何匹配#selector元素时,事件会冒泡到主文档 – 只要没有其他监听器调用event.stopPropagation()方法 – 这将会把事件冒泡到父代元素。

您正在监听与指定select器匹配的元素的任何事件,而不是绑定到特定元素或元素集。 这意味着您可以创build一个侦听器,一次会自动匹配当前存在的元素以及任何dynamic添加的元素。

这很明智,原因包括性能和内存利用率(在大规模应用中)

1.7中.live()的等价物如下所示:

 $(document).on('click', '#child', function() ...); 

基本上,观看文件的点击事件和过滤#child。

我知道答案有点迟,但是我为.live()方法创build了一个polyfill。 我已经在jQuery 1.11中testing过了,它似乎工作得很好。 我知道我们应该尽可能地实现.on()方法,但是在大型项目中,无论出于何种原因都无法将所有.live()调用转换为等效的.on()调用,可能会出现以下情况工作:

 if(jQuery && !jQuery.fn.live) { jQuery.fn.live = function(evt, func) { $('body').on(evt, this.selector, func); } } 

在加载jQuery之后,在调用live()之前,请将其join。

.on()适用于jQuery 1.7及更高版本。 如果你有一个旧版本,使用这个:

 $("#SomeId").live("click",function(){ //do stuff; }); 

我在项目中使用了“live”,但是我的一位朋友build议我应该使用“on”而不是live。 而当我试图使用,我遇到了像你一样的问题。

在我的网页上,我创buildbutton表行和dynamic许多dom的东西。 但是当我使用魔法消失的时候。

像其他的解决scheme,如使用它像一个孩子只是每次点击时调用你的function。 但我find了一种方法,使其再次发生,这里是解决scheme。

把你的代码写成:

 function caller(){ $('.ObjectYouWntToCall').on("click", function() {...magic...}); } 

呼叫呼叫者(); 在这样的页面中创build对象之后。

 $('<dom class="ObjectYouWntToCall">bla... bla...<dom>').appendTo("#whereeveryouwant"); caller(); 

通过这种方式,你的function被调用,而不是每一次点击页面。