[jQuery] 谈一下Jquery中的bind(),live(),delegate(),on()的区别?

在我们深入了解这些方法之前,我们先来一段常见的的HTML,作为我们编写jquery示例方法使用的样本。<ul id="members" data-role="listview" data-filter="true"><!-- ... 其他li ... --><li><a href="detail.html?id=10" rel="external nofollow" ><h3>John Resig</h3><p><strong>jQuery Core Lead</strong></p><p>Boston, United States</p></a></li><!-- ... 其他li ... -->
</ul>使用Bind方法.bind()方法将事件类型和一个事件处理函数直接注册到了被选中的DOM元素中。这个方法被使用得最久,在此期间,它很好的解决了各种跨浏览器的问题。当使用它来连接事件处理函数时,它仍然非常简洁,但是也存在着一些性能方面的问题,将在下面罗列出来。/* .bind() 方法将事件类型和一个事件处理函数直接注册到了被选中的DOM元素中。 .click() 方法只是.bind() 方法的简写。
*/$( "#members li a" ).bind( "click", function( e ) {} );
$( "#members li a" ).click( function( e ) {} );.bind()方法将会把事件处理函数连接到所有匹配的a标签。这种方式并不好。这样做的话,它不仅在所有匹配的元素中隐含地迭代附加事件处理函数,而且这些操作非常浪费(多余),因为这些相同的事件处理函数是被一遍一遍的重复的添加到所有匹配的标签上。优点:适用于各种浏览器连接事件处理函数非常方便快捷可以使用 .click() ,  .hover()等简写方法来更方面地连接事件处理函数对于一个简单的ID选择器,使用.bind() 方法不仅可以很快地连接事件处理函数,而且当事件被触发时, 事件处理函数几乎是马上就被调用了缺点:这样方法会将所有的事件处理函数附加到所有匹配的元素不可以动态地匹配相同选择器的元素当操作大量匹配的元素时会有性能方面的问题附加操作是在前期完成的,这可能导致页面加载时存在性能问题使用Live方法.live()方法使用了事件委托的概念来实施其所谓的“魔法”。你调用live()方法的方式就像是调用bind()方法那样方便。然而在这表面之下, .live()方法与前者的实现方式大不相同。 .live()方法将与事件处理函数关联的选择器和事件信息一起附加到文档的根级元素(即document)。通过将事件信息注册到document上,这个事件处理函数将允许所有冒泡到document的事件调用它(例如委托型、传播型事件)。一旦有一个事件冒泡到document元素上,Jquery会根据选择器或者事件的元数据来决定哪一个事件处理函数应该被调用,如果这个事件处理函数存在的话。这个额外的工作将会在用户交互时对性能方面造成一定的影响,但是初始化注册事件的过程相当地快。/* 方法将与事件处理函数关联的选择器和事件信息一起附加到文档的根级元素(即document) ( "#members li a" & "click" ) */$( "#members li a" ).live( "click", function( e ) {} );.bind()这个例子与上面bind()方法的例子对比的话有一个优点在于它仅仅把事件处理函数附加到document元素一次,而不是很多次。这样不仅更快,而且还减少了性能的浪费。然而,使用这个方法也会带来很多问题,下面将一一列出。优点:所有的事件处理函数都只会被注册一次,而不是像bind()那样进行多次注册将bind()方法升级到live()方法非常方便,你仅需要将"bind"替代为"live"就可以了那些被动态添加到DOM的元素也将被神奇的匹配到,因为真实的事件信息是被注册到document元素上的你可以在文档加载完之前连接事件处理函数,这样可以帮助你更好地利用你可能没有用的时间缺点:这个方法在Jquery 1.7以后的版本被弃用了,你应该在你的代码里逐步放弃使用它使用这个方法时链式操作没有得到正确的支持,可能会出现某些错误所做的匹配操作基本上没用因为它只用于在document元素上注册事件处理函数使用 event.stopPropogation() 方法将会没用,因为事件总是已经被委托到了document元素上因为所有的选择器或者事件信息都被附加到document元素上了,所以一旦有一个事件要调用某个事件处理函数,Jquery会在一大堆储存的元数据中使用matchesSelector方法来决定哪一个事件处理函数将会被调用,如果这个函数有的话。因为你所连接的事件总是被委托到document上,所如果你的DOM的层级很深的话,这会导致一定的性能问题使用Delegate方法.delegate()方法与live()方式实现方式相类似,它不是将选择器或者事件信息附加到document,而是让你指定附加的元素。就像是live()方法一样,这个方法使用事件委托来正确地工作。如果你跳过了前面关于 .live() 方法的介绍,你可能要回去重新看看它,因为这里涉及到之前我所阐述的一些内部逻辑/* .delegate() 方法会将选择器和事件信息 ( "li a" & "click" ) 附加到你指定的元素上 ( "#members" )。
*/$( "#members" ).delegate( "li a", "click", function( e ) {} );.delegate()方法十分强大。在上面这个例子中,与事件处理函数关联的选择器和事件信息将会被附加到( #members" )这个元素上。这样做比使用live()高效多了,因为live()方法总是将与事件处理函数关联的选择器和事件信息附加到document元素上。另外,使用.delegate()方法解决许多其他问题。请参阅下方列出的详细信息。优点:你可以选择将选择器或者事件信息附加到指定的元素。匹配操作实际上在前面并没有执行,而是用来注册到指定的元素。链式操作可以得到正确的支持Jquery仍然需要迭代这些选择器或者事件信息来匹配元素,不过因为你可以选择哪一个元素作为根元素,所以筛选的量会大幅减少因为这项技术使用了事件委托机制,它可以匹配到被动态地添加到DOM的元素你可以在文档加载完之前连接事件处理函数缺点:从.bind()方法不可以直接升级到.delegate()方法Jquery仍然需要使用marchesSelector方法在附加到指定根元素的选择器或者事件信息中筛选决定哪一个事件处理函数会被调用。然而,附加到指定根元素的元数据会比使用live()方法的时候要小得多。当操作大量匹配的元素时会有性能方面的问题附加操作是在前期完成的,这可能导致页面加载时存在性能问题使用On方法你知道吗,在Jquery 1.7版本中.bind() , .live() 和.delegate()方法只需要使用.on()方法一种方式来调用它们。当然.unbind() , .die() 和.undelegate()方法也一样。一下代码片段是从Jquery 1.7版本的源码中截取出来的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 ) {return arguments.length == 1 ? this.off( selector, "**" ) : this.off( types, selector, fn );
}考虑到这一点,使用.on()方法看起来像以下方式一样.../* Jquery的 .bind() , .live() 和 .delegate() 方法只需要使用`.on()`方法一种方式来调用它们 */// Bind
$( "#members li a" ).on( "click", function( e ) {} );
$( "#members li a" ).bind( "click", function( e ) {} );// Live
$( document ).on( "click", "#members li a", function( e ) {} );
$( "#members li a" ).live( "click", function( e ) {} );// Delegate
$( "#members" ).on( "click", "li a", function( e ) {} );
$( "#members" ).delegate( "li a", "click", function( e ) {} );你可能注意到了,我如何使用.on()方法决定了它如何调用其他方法。你可以认为.on()方法被具有不同签名的方法”重载“了,而这些方法实现了不同的事件绑定的连接方式。 .on()方法的出现为API带来了很多方面的一致性,并希望让事情变得不那么混乱。优点:使各种事件绑定方法一致。因为在Jquery源码中.bind() , .live() 和.delegate()方法实际上是调用了此方法,因此简化了jQuery代码库并删除了一级重定向。这种方式仍然提供了使用.delegate()方法的优点,并且仍然提供对.bind()方法的支持,如果你需要的话。缺点:给人带来了一些疑惑,因为方法的实际执行方式将根据你如何调用方法而改变。

个人简介

我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易,
但坚持一定很酷。欢迎大家一起讨论

主目录

与歌谣一起通关前端面试题

[jQuery] 谈一下Jquery中的bind(),live(),delegate(),on()的区别?相关推荐

  1. 浅谈Jquery中的bind(),live(),delegate(),on()绑定事件方式

    前言 因为项目中经常会有利用jquery操作dom元素的增删操作,所以会涉及到dom元素的绑定事件方式,简单的归纳一下bind,live,delegate,on的区别,以便以后查阅,也希望该文章日后能 ...

  2. mysql declare与set的区别_浅谈MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  3. mysql存储过程set什么意思_浅谈MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  4. jquery unbind 异步_JQuery中的bind()和unbind()的理解

    bind()和unbind()提供了事件的绑定和取消机制,既可以绑定html默认支持的事件,也能够绑定自定义的事件. 1.JQuery中事件可以重复绑定,不会覆盖. 1 $("#button ...

  5. 【转】jQuery中的bind(),live(),delegate(),on()事件绑定方式的区别

    bind()                                                                                               ...

  6. jQuery中.bind() .live() .delegate() .on()的区别

    bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数 $("a").bind("click",function(){alert(& ...

  7. jquery 事件绑定及取消 bind live delegate on one区别 (超详细且通俗易懂)

    on bind delegate live one 四种方法差别不是特别大 bind讲完后,后面的方法只会说不同点 1.bind() $(selector).bind(event,data,funct ...

  8. JavaScript--------------------jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画...

    bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){alert( ...

  9. jQuery 中bind(),live(),delegate(),on() 区别

    on()来改写通过 .bind(), .live(), .delegate()所注册的事件 /* The jQuery .bind(), .live(), and .delegate() method ...

最新文章

  1. python爬虫系列(5.3-动态网站的爬取的策略)
  2. android 情景感知 sdk,情景感知服务
  3. mysql自增mybatis返回主键_Mybatis + mysql 返回自增主键
  4. linux之cal命令详解,linux命令大全之cal命令详解(显示日历)
  5. oracle分库分表原理_02. MyCat 的原理,应用场景,分库分表的思想
  6. 快速WinForm开发
  7. spring 的配置 beanpropertyname属性
  8. Akka2使用探索3(Duration 和 Deadline)
  9. php 运算器,运算器的功能是什么
  10. javascript event
  11. django 项目中遇到的问题(持续更新中)
  12. python pandas excel 排序_Pandas 按组汇总和列排序 - python
  13. 计算机建筑制图实践报告,工程建筑实习报告范文(精选5篇)
  14. 企业公众号如何申请开通模板消息功能?
  15. uniapp 调用原生插件包含第三方SDK时抛NoClassDefFoundError异常
  16. IE8 正式版官方下载链接
  17. 严蔚敏《数据结构》——二叉树
  18. 通过 BTC 联动程度判断牛熊
  19. 靶机渗透----bulldog2
  20. 从一个CFS调度案例谈Linux系统卡顿的根源

热门文章

  1. webgl 着色器_如何使用AI,AR和WebGL着色器来帮助视障人士
  2. 用户体验改善案例_用户体验案例研究:建立更好的体验(重新设计“和平航空”网站)...
  3. 学习sql注入:猜测数据库_面向数据科学家SQL:学习简单方法
  4. 阿里巴巴是如何打通 CMDB,实现就近访问的?
  5. Java中字符串连接符(+)和append的区别
  6. [HEOI2015]兔子与樱花
  7. LTDC/DMA2D—液晶显示
  8. Swift 3.0 on Ubuntu 15.10
  9. php中json_decode()和json_encode()的使用方法
  10. [BBS]搭建开源论坛之Jforum搭配开源CKEDITOR