Jquery中bind()、live()、delegate()和on()的区别

自Jquery1.7起,on()方法是 bind()、live()、delegate() 方法的新的替代品,我们推荐使用on()来处理业务中的事件绑定,通过理解这些方法的差异能够更加清晰明白使用on()方法的优势所在

Jquery中bind()、live()、delegate()和on()的区别

所属分类: WEB
专题标签: 方法 绑定 Jquery

关于on()方法

自Jquery1.7起,on()方法是 bind()、live()、delegate() 方法的新的替代品。
但这不并意味着其他处理事件绑定的方法没有意义,实际开发过程中可以依照场景选择某些方法。

bind()方法

bind()方法将事件类型和一个事件处理函数直接注册到了被选中的DOM元素中。
当使用它来连接事件处理函数时,它仍然非常简洁,但是也存在着一些性能方面的问题

  1. //bind() 方法将事件类型和一个事件处理函数直接注册到了被选中的DOM元素中。
  2. //常见的click()方法是bind()方法的简写
  3. $("#add").bind("click",function(e){});
  4. //等效
  5. $("#add").click(function(e){});

优点:

  • 适用于各种浏览器
  • 连接事件处理函数非常方便快捷
  • 可以使用.click()、.hover()等简写方法来更方面地连接事件处理函数
  • 对于简单的ID选择器,使用bind()方法可以很快地连接事件处理函数,而且当事件被触发时,事件处理函数几乎是马上就被调用了

缺点:

  • 当匹配多个元素时,会将所有的事件处理函数附加到所有匹配的元素
  • 不可以动态地匹配相同选择器的元素
  • 操作大量匹配的元素时会有性能方面的问题
  • 附加操作是在前期完成的,这可能导致页面加载时存在性能问题

live()方法

live()方法在使用时与bind()方法一致,但在实际处理时,存在一个委托机制。
方法将与事件处理函数关联的选择器和事件信息一起附加到文档的根级元素(即document)。
通过将事件信息注册到document上,这个事件处理函数将允许所有冒泡到document的事件调用它。
一旦有一个事件冒泡到document元素上,Jquery会根据选择器或者事件的元数据来决定哪一个事件处理函数应该被调用。
这个工作在用户交互时对性能方面造成一定的影响,但是初始化注册事件的过程相当地快。

  1. $("#add").live("click",function(e){});

优点:

  • 所有事件处理函数都只注册一次,不像bind()那样进行多次注册
  • 将bind()方法升级到live()方法非常方便,你仅需要将”bind”替代为”live”
  • 动态添加到DOM的元素也将被神奇的匹配到,真实的事件信息是被注册到document元素上的
  • 可以在文档加载完之前连接事件处理函数,这样可以更好地利用时间

缺点:

  • Jquery1.7以后的版本被弃用,应该在代码里逐步放弃使用它
  • 使用这个方法时链式操作没有得到正确的支持,可能会出错
  • 所做的匹配操作基本上没用,因为它只用于在document元素上注册事件处理函数
  • 使用event.stopPropogation()方法将会没用,事件已经被委托到了document
  • 所有的选择器或者事件信息都被附加到document元素上了,所以一旦有一个事件要调用某个事件处理函数,Jquery会在一大堆储存的元数据中使用matchesSelector方法来决定哪一个事件处理函数将会被调用
  • 所连接的事件总是被委托到document上,所如果你的DOM的层级很深的话,会导致一定的性能问题

delegate()方法

delegate()方法与live()方式实现方式相类似,但不是将选择器或者事件信息附加到document,而是让你指定附加的元素
与live()方法类似的地方在于,这个方法也是使用事件委托来完成

  1. //#add将作为根元素进行事件委托
  2. $("#add").delegate("a","click",function(e){});

优点:

  • 可以选择将选择器或者事件信息附加到指定的元素
  • 匹配操作实际上在前面并没有执行,而是用来注册到指定的元素
  • 链式操作可以得到正确的支持
  • Jquery仍然需要迭代这些选择器或者事件信息来匹配元素,不过选择的元素作为根元素,所以筛选的量会大幅减少
  • 使用了事件委托机制,可以匹配到被动态地添加到DOM的元素
  • 可以在文档加载完之前连接事件处理函数

缺点:

  • bind()方法不可以直接升级到delegate()方法
  • Jquery仍然需要使用marchesSelector方法在附加到指定根元素的选择器或者事件信息中筛选决定哪一个事件处理函数会被调用
  • 当操作大量匹配的元素时会有性能方面的问题

on()方法

在Jquery1.7版本后bind()、live()和delegate()方法只需要使用on()方法一种方式来调用它们

  1. //基本实例
  2. $("p").on("click",function(e){});

优点:

  • 使各种事件绑定方法一致
  • 在Jquery源码中bind()、live()、delegate()方法实际上是调用了此方法,简化了jQuery代码库并删除了一级重定向
  • 提供了使用delegate()方法的优点,并且仍然提供对bind()方法的支持

缺点:

  • 给人带来了一些疑惑,因为方法的实际执行方式将根据你如何调用方法而改变

小结

  1. 减少使用bind()方法,因为它把同一个事件处理函数附加到了每一个匹配的元素上
  2. 停用live()方法,因为它已经被弃用了同时也会带来很多问题
  3. delegate()方法会给你带来很多好处当你需要解决一些性能上的问题和对动态添加的元素作出处理
  4. on()方法其实就是模拟bind()、live()、delegate()实现的语法糖,具体取决于你如何调用它
  5. 尽量使用新的on()方法,尤其在Jquery1.7版本后尽情使用该方法!