jQuery.bind()和jQuery.on()之间有什么区别?
为什么.on()现在在jQuery 1.7中更受欢迎?
.on()
现在在一个统一的方法中提供了.live()
.delegate()
和.bind()
的组合。 您可以通过如何使用.on()
的参数来.on()
这三者中的任何一个的行为。
这些对在function上是相同的:
// events bound directly to the object they occur on $('.button').on('click', fn); $('.button').bind('click', fn); // events intercepted after bubbling up to a common parent object $('.container').on("click", '.button', fn); $('.container').delegate('.button', "click", fn);
更多信息在jQuery博客条目中描述。
在统一这些单独的函数之前,jQuery有多个不同的实现。 现在, .on()
是超集函数,而.bind()
.delegate()
.live()
和.delegate()
都只是在它们的实现中调用.on()
,所以现在只有一个实际事件处理实现。 因此,从这个角度来看,它也是一个代码清理和简化问题。 类似地, .die()
.undelegate()
和.unbind()
.off()
现在只调用.unbind()
而不是单独的实现。
注意: .live()
已被弃用于所有版本的jQuery,因为它只是拦截文档对象上所有冒泡事件的特殊情况,因此可以很容易地用.delegate()
或.on()
替换.delegate()
事件都在文档对象上处理,它可能成为检查每个事件上的许多选择器的性能问题。 将像这样的委托事件挂钩到一个更接近事件发生位置的公共父级,而不是将它们全部放在文档对象上(因此.live()
不能使用它)会更有效。
从jQuery 1.7源代码中,您可以看到所有这些函数现在如何调用.on()
和.on()
.off()
:
bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); }, live: function( types, data, fn ) { jQuery( this.context ).on( types, this.selector, data, fn ); return this; }, die: function( types, fn ) { jQuery( this.context ).off( types, this.selector || "**", fn ); return this; }, delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); }, undelegate: function( selector, types, fn ) { // ( namespace ) or ( selector, types [, fn] ) return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); },
MAIN的不同之处在于.bind要求元素(选择器)在它附加的时候存在,而.on没有那个要求,并且。在我看来坦率地说有更好/更优雅的语法。 请参阅文档第一段http://api.jquery.com/bind/
旧方法有点混乱 – live()
, delegate()
和bind()
之间的区别并不清楚。 通过使on()
处理附加任何事件的函数,无论它是否存在,它都更容易使用。
在此之前, live()
比新的on()
函数慢很多,因此你必须在bind()
和live()
之间做出选择。