在jQuery中.bind() .live() .delegate() .on()的区别
分别用.bind() .live() .delegate() .on() 实现光棒效果
.bind()
.bind()注册的事件直接指向相对应的DOM元素。这个方法从jquery 1.0都有了,并且这个方法能够很酷的处理跨浏览器的事件绑定问题。对,这个方法用起来很方便。但是问题来了,就是各种各样的性能问题
$(function(){
$("li").bind({
mouseover:function(){
$(this).css("background","pink");
},
mouseout:function(){
$(this).css("background","");
},
});
});
优点
- 跨浏览器
- 非常方便和快捷地绑定事件
- 对于简单的ID选择器来说,使用.bind()不仅方便,而且当触发这个事件的时候能够即时响应。
缺点
- 这个方法会附加相同的处理程序到每一个匹配到的元素上
- 对于动态添加的属于匹配到的元素,不会被触发事件的
- 性能问题,对于处理大量的匹配元素的时候
- 如果在页面加载前要处理添加事件的话,会影响加载效率的
.live()
调用.live()方法看起来和调用.bind()方法一样,非常方便。但是他们下面的实现原理却不同。.live()方法附加事件处理程序到根一级的document上来关联匹配到的元素和事件信息。通过注册事件处理程序到document上来允许事件处理程序通过冒泡来绑定事件和匹配的元素(译者:注意,事件其实在document上的)。一旦事件冒泡到document的时候,jQuery判断选择器和事件处理程序是否有匹配到的,如果有的话,则调用对应的事件处理程序。很明显的会在用户使用的过程中有性能问题,但是在绑定注册的时候是非常的迅速的。
$(function(){
$("li").live({
mouseover:function(){
$(this).css("background","pink");
},
mouseout:function(){
$(this).css("background","");
}
});
});
优点
- 相对于.bind()的循环注册很多次事件处理程序来说,.live()只注册一次事件处理程序
- 从.bind()更新到.live()的方法对程序更改很少,只需要替换“bind”为”live”
- 对于动态添加的属于匹配到的元素,也能够“神奇”的执行处理程序
- 在document元素没有全部加载完之前都能够几乎不花时间地绑定并触发事件
缺点
- 此方法在jQuery1.7的时候已经废除,你应该逐步从你的代码中替换掉该方法
- 链接不能够正常的支持这个方法
- 这个方法被抛弃是因为它只能够绑定事件处理程序到document上
- event.stopPropagation()不再有效了,因为事件已经委托到了document上了
- 由于所有的选择器和事件信息都是附加到了document上的,所以一个确定的事件要触发,必须通过大量的存储信息来匹配到
- 由于事件都是委托到了document上的,所以如果DOM太深的话,会影响到性能的
.delegate()
.delegate()方法的行为有点类似.live()。但是不是把选择器和事件的信息附加到了document上,而是可以自行选择它要附加的DOM元素,这个技术可以让事件的委托正常工作。 如果你跳过了.live()的介绍和分析,请先跳回去读一下,接着我才能向你表述清楚下面的逻辑
$(function(){
$("ul").delegate("li",{
mouseover:function(){
$(this).css("background","red");
},
mouseout:function(){
$(this).css("background","");
}
});
});
优点
- 可以自由选择附加的选择器和事件信息的位置
- 链接也可以有效的支持了
- jQuery仍然需要循环访问选择器和事件数据来确定匹配,但是因为能够选择这些信息附加的位置,所以通过匹配的量小很多了
- 由于这种技术使用了事件委托,所以它能很好的动态处理添加到DOM元素
- 如果你委托事件到了document上,你也可以在document全部准备完之前绑定和调用
缺点
- 方法从.bind()更改到.delegate()比较麻烦
- 如果把选择器和事件数据附加到了document上,仍然需要很多的匹配信息,但是相对于.live()的存储量要小很多了
.on()
你知道jQuery中的.bind() .live 和 .delegate()方法都是通过同一个新方法实现的.on() (在jQuery1.7后)
$(function(){
$("li").on({
mouseover:function(){
$(this).css("background","yellow");
},
mouseout:function(){
$(this).css("background","");
}
});
});
优点
- 为各种事件绑定方法带来了统一性
- 简化了jQuery代码库,并删除一个界别的重定向,因为通过调用这个方法实现了 .bind() .live() 和 .delegate()
- 仍然提供了好用的.delegate()方法,但是也仍然对.bind()方法提供了支持
缺点
- 因为调用这个方法的各个形式,会带来一些混乱
总结:
从这篇文章中应该记住的要点:
- 使用.bind()方法是很浪费资源的,因为它要匹配选择器中的每一项并且挨个设置相同的事件处理程序
- 建议停止使用.live()方法,因为它已经被弃用了,由于他有很多的问题
- .delegate()方法“很划算”用来处理性能和响应动态添加元素的时候
- 新的.on()方法主要是可以实现.bind() .live() 甚至 .delegate()的功能
- 建议使用.on()方法,如果你的项目使用了1.7+的jQuery的话