jQuery live()vs on on(1.7+)

我知道从jQuery 1.7开始,不推荐使用.live()方法。 所以这就是我提出的:

$(document.body).on('click', '#list', function() { console.log($(this)); }); 

这几乎是诀窍,相当于:

 $('#list').live('click', function(){ console.log($(this)); }); 

它们都返回#list jQuery对象,这就是我想要的。 然而问题是当我将jQuery对象作为第二个参数而不是字符串(经常发生)传递时,例如:

 var list = $('#list'); $(document.body).on('click', list, function() { console.log($(this)); }); 

控制台返回$(body) jQuery对象。 那点上没用。 ;) 有任何想法吗?

编辑:这里的问题不是如何从示例1和2访问受影响的对象$(’#list’),而是如何在示例3中访问它。

您将在官方文档中找到一个非常明确的答案:

不再推荐使用.live()方法,因为更高版本的jQuery提供了没有缺点的更好的方法。 特别是,使用.live()会出现以下问题:

  • 在调用.live()方法之前,jQuery尝试检索选择器指定的元素,这在大型文档上可能很耗时。
  • 不支持链接方法。 例如, $("a").find(".offsite, .external").live( ... ); 无效,无法按预期工作。
  • 由于所有.live()事件都附加在document元素上,因此事件在处理之前会占用最长和最慢的路径。
  • 在事件处理程序中调用event.stopPropagation()对于停止附加在文档中较低位置的事件处理程序是无效的; 该事件已经传播到document
  • .live()方法以令人惊讶的方式与其他事件方法交互,例如, $(document).unbind("click")删除通过对.live()任何调用附加的所有点击处理程序!

将对象作为第二个参数传递给on是完全错误的。

来自文档 :

.on( events [, selector] [, data], handler(eventObject) )

它要求使用选择器而不是jQuery对象,因此您需要使用:

 $(document.body).on('click', '#list', function() { console.log($(this)); });