【问题标题】:.live() vs .on() method.live() 与 .on() 方法
【发布时间】:2012-02-09 16:59:10
【问题描述】:

我正在做一个项目,在该项目中,当我使用 .live() 方法继续按下 min/plus 按钮而不将鼠标悬停在图片上时,该功能起作用。在.on() 方法的情况下,该功能不起作用。

我该如何解决这个问题,所以它也适用于.on() 方法?

这也是我所指的an example(我修复了此示例中的错误,但我使用的.on方法错误)。

【问题讨论】:

  • 总而言之,按照 jQuery 专家的建议,您应该开始使用 .on() 和 .off() 而不是 .live() 来进行下一个项目开发。。他们在哪里不同意?
  • @Blender:我认为不同意这篇文章。为了清楚起见,编辑了问题。
  • 不同意一篇文章,很好……但是不同意the jQuery docs的理由是什么?
  • 你们可以在 DEMO 中看到,.on 方法与 ,live 方法的结果不同,请查看 DEMO 以了解我的问题
  • @nouky 下次在问这样的问题之前,假设 jQuery 开发人员比你更了解它。尝试阅读有关如何正确使用某个功能的手册,而不是说该功能不起作用。

标签: jquery click live


【解决方案1】:

您没有正确使用它。 .live() 的替换是 $(document).on(),其中传递了事件和处理程序,当然......例如:

$(document).on('click', '#myElement', function() { 
  //... some function ...
});

值得一提的是,在.on() 出现之前,.live() 已经被认为是处理这种绑定的低效方式。推荐使用 .delegate(),现在推荐使用 .on()(使用委托语法)。

或者举个例子:你应该选择不会被 DOM 操作破坏的最近的祖先,而不是作为侦听器的文档(这是 .live() 过去所做的)。老实说,我发现“jsdo.it”使用起来有点笨拙,所以我没有想到具体的元素,但是例如,给定结构:

<div id="ajax_container">
 <button id="do_something">Clicky!</button>
 <p>Some dynamically-loaded content</p>
</div>

ajax_container 的内容被 Ajax 调用替换(无需显示该部分的代码),为该按钮的单击事件绑定未销毁的侦听器(容器 div)如下所示:

$('#ajax_container').on('click', '#do_something', function() {
 // do something
})

【讨论】:

  • 为了提高性能,我会在 DOM 中使用比 document 更接近目标元素的父元素,但您的答案是正确的 +1。
  • 不能再同意了。当您撰写评论时,已经在撰写该更新。 ;-)
  • 不客气!不是每个人都喜欢 .on() 语法,但我很喜欢……这与我们过去使用内联 onClick (和类似的)事件绑定的日子有联系。 ;-) 不知何故,我觉得语法比 .delegate() 更直观。您需要指定侦听器而不是隐含它(如 .live())这一事实也使其更具可读性。
【解决方案2】:

你必须发布一些代码来确定你的实现为什么不起作用,但你应该查看 jQuery 源代码以获取如何使用 .on() 和 .live() 的示例

<div id="parent">
 <a href="#" id="anchor">Click Me</a>
</div>

$('#anchor').live('click',function() { }):
$('#parent').on('click','#anchor',function() { });
$('#anchor').on('click',function() { });

.live() 事件监听器被添加到文档元素中,因此只要事件一直冒泡到文档元素,就会触发回调

在第二个示例($('#parent').on())中,事件侦听器被添加到父元素,并且每次点击事件冒泡到 #parent 并来自(或与一路上)一个名为#anchor的元素

第三个示例( $('#anchor').on() )将事件监听器直接添加到锚元素本身,与 $('#anchor').bind('click',function () { });

引入 .live() 的原因是,如果您的页面结构发生变化,仍然可以触发事件回调,因为事件侦听器本身已附加到文档元素。

您可以在类似的方法中使用 on,但它必须将自身附加到未从页面中删除的元素 - 如果该元素被删除,那么所有事件侦听器也会随之删除。

http://api.jquery.com/on/ http://api.jquery.com/live/

【讨论】:

  • 我认为你在最后两段中的解释有点不对劲。阅读 jQuery 文档 herehere.on() 方法提供了附加事件处理程序所需的所有功能。”“从 jQuery 1.7 开始,.live() 方法已弃用。使用 .on() 附加事件处理程序。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 2012-02-03
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多