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被调用,而不是每一次点击页面。