为什么.on()现在在jQuery 1.7中更受欢迎?
答案 0 :(得分:28)
.on()
现在在一个统一的方法中提供了.live()
,.delegate()
和.bind()
的组合。您可以通过如何使用.on()
的参数来获取这三者中的任何一种的行为。
这些对在功能上是相同的:
// 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 blog entry。
中描述在统一这些单独的函数之前,jQuery有多个不同的实现。现在,.on()
是超集函数,.bind()
,.live()
和.delegate()
都只是在其实现中调用.on()
,所以现在只有一个实现事件处理。因此,从这个角度来看,它也是一个代码清理和简化问题。同样,.die()
,.undelegate()
和.unbind()
现在只需调用.off()
,而不是单独实现。
注意:对于所有版本的jQuery,已弃用.live()
,因为它只是拦截文档对象上所有冒泡事件的特殊情况,因此可以使用.delegate()
或{{ 1}}当许多事件都在文档对象上处理时,它可能成为检查每个事件上的许多选择器的性能问题。将像这样的委托事件挂钩到更接近事件发生位置的公共父级,而不是将它们全部放在文档对象上(因此.on()
不能使用的原因)会更有效。
从jQuery 1.7源代码中,您可以看到所有这些函数现在如何调用.live()
和.on()
:
.off()
答案 1 :(得分:3)
MAIN的区别在于.bind要求元素(选择器)在它附加的时间存在,而.on没有那个要求,并且。在我看来坦率地说有更好/更优雅的语法。请参阅文档第一段http://api.jquery.com/bind/
答案 2 :(得分:1)
旧方法有点混乱 - live()
,delegate()
和bind()
之间的区别并不清楚。通过使on()
处理附加任何事件的函数,无论它是否存在,它都更容易使用。
在此之前,live()
比新on()
功能慢得多,因此您必须在bind()
和live()
之间进行选择。