3

我知道从 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 中访问它。

4

2 回答 2

3

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

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

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

将对象作为第二个参数传递给on.

文档

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

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

$(document.body).on('click', '#list', function() {
    console.log($(this));
});
于 2012-07-27T11:25:16.543 回答