jQuery $(this).live()和.on()事件处理程序之间的引用差异

时间:2014-01-03 09:45:25

标签: javascript jquery

今天,我尝试回答问题here。所以,问的人如何使用jQuery 1.6由于某种原因(我之前从未使用过这个版本)。但是我知道 .live() 事件附件与文档中的数据选项,在1.7中已弃用。所以,当我在事件处理函数中使用$(this)时,它返回选择器对象而不是数据对象。

所以我在这里创建了两个测试文件,一个在jQuery 1.6.4中,另一个在1.10.1中,如下所示。

Jquery 1.6.4

$('body').live('click', 'span.some_class', function(e){
    console.log($(this))
});

Jquery 1.10.1

$('body').on('click', 'span.some_class', function(e){
   console.log($(this));
});

first case我得到了以下输出:

[body, context: body, constructor: .... 

second case我得到了以下输出:

[span.some_class, context: ......

所以,我有疑问,为什么输出有所不同?有人可以给我解释一下这方面的历史知识吗? 因为当他们问我与jQuery 1.6.4相关的问题时,帮助别人对我有用。

  

编辑:所以我明白我在这里做错了是我用.on()搞砸了.live(),这在新版本的jQuery中并不相同。所以   .on()相当于1.6.4中的.delegate()和相当于的live()   绑定()。 抱歉我的问题。我没有仔细阅读文档。

1 个答案:

答案 0 :(得分:1)

liveon之间的区别在于live直接附加到元素,on被委托给元素。引入了on()来简化所有类型的jQuery绑定(也是bind()delegate())。

考虑以下html:

<div class="foo">
     <div class="bar">
     </div>
</div>

这个jQuery绑定:

//live() checks the whole DOM on every change, could get very slow 
$(".bar").live("click",...);

//on() only has to check a part of the DOM on changes
$(".foo").on("click",".bar",...);

并且,为什么您的控制台输出错误?

你没有使用实时正确。它必须是:$('span.some_class').live('click', function(e){... }); 第二个参数只是解析其他数据。