Javascript 用于在加载动态html后添加单击事件的jQuery.live()vs.on()方法

Javascript 用于在加载动态html后添加单击事件的jQuery.live()vs.on()方法,javascript,jquery,events,dom,handler,Javascript,Jquery,Events,Dom,Handler,我正在使用jQueryV.1.7.1,其中.live()方法显然已被弃用 我遇到的问题是,当使用以下命令将html动态加载到元素中时: $('#parent').load("http://..."); 如果我尝试在之后添加click事件,它不会使用以下任一方法注册该事件: $('#parent').click(function() ...); 或 实现此功能的正确方法是什么?对我来说,它似乎只适用于.live(),但我不应该使用这种方法。注意#child是一个动态加载的元素 谢谢 $(d

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

我遇到的问题是,当使用以下命令将html动态加载到元素中时:

$('#parent').load("http://..."); 
如果我尝试在之后添加click事件,它不会使用以下任一方法注册该事件:

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

实现此功能的正确方法是什么?对我来说,它似乎只适用于.live(),但我不应该使用这种方法。注意#child是一个动态加载的元素

谢谢

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

编辑:我提供了更多关于这是如何工作的信息,因为。。。话。 在本例中,您将在整个文档上放置一个侦听器

当您在匹配
.selector
的任何元素上单击
时,只要没有其他侦听器调用
event.stopPropagation()
方法,事件就会冒泡到主文档中,这会使事件冒泡到父元素

您正在侦听来自与指定选择器匹配的元素的任何事件,而不是绑定到特定元素或元素集。这意味着您可以一次性创建一个侦听器,该侦听器将自动匹配当前存在的元素以及任何动态添加的元素

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

编辑:

显然,您可以监听的最接近的父元素更好,并且您可以使用任何元素来代替
文档
,只要您要监视事件的子元素位于该父元素内。。。但这与问题无关。

.on()适用于jQuery 1.7及以上版本。如果您有旧版本,请使用以下选项:

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

$('#parent').on('click', '#child', function() {
    // Code
});
从文件中:

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

调用
#child
元素上的
$.on()
时,该元素不存在,因此事件不会绑定(与
$.live()
不同)<但是,code>#parent
确实存在,因此可以将事件绑定到它


上面代码中的第二个参数充当“过滤器”,仅当事件从
#child
冒泡到
#parent
时才会触发。如果希望单击处理程序对动态加载的元素起作用,则在父对象上设置事件处理程序(不动态加载)并为其指定一个与动态对象匹配的选择器,如下所示:

$('#parent').on("click", "#child", function() {});
$(document).on('click', '#child', function() ...); 
事件处理程序将附加到
#parent
对象,并且每当在
#child
上产生的单击事件出现时,它都会触发您的单击处理程序。这称为委派事件处理(事件处理委派给父对象)

这样做是因为即使子对象还不存在,您也可以将事件附加到父对象,但当它以后存在并被单击时,单击事件将冒泡到父对象,它将看到它起源于
#child
,并且有一个事件处理程序,用于单击
#child
,并触发您的事件。

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

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

基本上,查看文档中的点击事件并过滤它们以查找#child。

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

在我的页面上,我动态地创建按钮、表行和许多dom内容。但是当我用上魔法的时候就消失了

其他解决方案,如像孩子一样使用它,每次单击都会调用您的函数。 但我找到了一种方法让它再次发生,这里是解决办法

将代码编写为:

function caller(){
    $('.ObjectYouWntToCall').on("click", function() {...magic...});
}
调用调用方();在页面中像这样创建对象之后

$('<dom class="ObjectYouWntToCall">bla... bla...<dom>').appendTo("#whereeveryouwant");
caller();
$('bla…bla…)。附加到('where youwant');
调用者();

通过这种方式,当函数不应该每次单击页面时,就会调用该函数。

我知道现在回答有点晚,但我已经为.live()方法创建了一个polyfill。我已经在jQuery1.11中对其进行了测试,它似乎运行得很好。我知道我们应该尽可能地实现.on()方法,但在大型项目中,无论出于何种原因,都不可能将所有.live()调用转换为等效的.on()调用,以下方法可能有效:

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

只需在加载jQuery之后和调用live()之前包含它。

OP说“我正在使用jQuery v.1.7.1”@jfriend——为什么不发布你自己的答案,而不是对我的答案进行向下投票呢?我每天都在1.6以下的所有版本中使用live(),效果很好。我可以看出你很擅长阅读文档,但有时对一个人来说,把一些东西付诸实践会更有帮助。live()有效。句号。@MatthewPatrickCashatt-我确实发布了我自己的答案,也没有投你的反对票-不要做出这种盲目的假设。在1.7版本之前,
.delegate()
的性能要比
.live()
好得多,这就是为什么jQuery文档推荐它并反对
.live()
。是的,
.live()
仍然有效,但是这里的答案应该推荐更好的方法。我在这里已经看过20次了。如果你在这里发布带有
.live()
的代码,它将被否决(除非它有其他严重问题,否则我通常不会否决)。我没有否决,但尽管
.live()
即使在1.7版中也肯定有效,你仍然应该使用
.delegate()
on()
因为
.live()
被弃用是有充分理由的。只要你注意到语法上的变化