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()之间做出选择。