`

jQuery中的.bind()、.live()和.delegate()分析

 
阅读更多

首先,可视化一个HMTL文档的DOM树是很有帮助的。一个简单的HTML页面看起来就像是这个样子:

 

 

事件冒泡(又称事件传播)当我们点击一个链接时,其触发了链接元素的单击事件,该事件则引发任何我们已绑定到该元素的单击事件上的函数的执行。利用事件传播(这里是冒泡)这个机制,就可以实现事件委托。具体来说,事件委托就是事件目标自身不处理事件,而是把处理任务委托给其父元素或者祖先元素,甚至根元素(document

 

 

一个单击操作会触发alert函数的执行。click事件接着会向树的根方向传播,广播到父元素,然后接着是每个祖先元素,只要是它的某个后代元素上的单击事件被触发,事件就会传给它,在操纵DOM的语境中,document是根节点。


 

现在我们再来说明.bind().live().delegate()的不同之处

.bind()

这是最简单的绑定方法了。JQuery扫描文档找出所有的$('a')元素,并把alert函数绑定到每个元素的click事件上。注:其隐含意思,.bind()只能给调用它的时候已经存在的元素绑定事件,不能给未来新增的元素绑定事件。如果是Ajax过来的元素则无能为力,但是其胜在效率高

 

 

.live() 

 

JQueryalert函数绑定到$(document)元素上,并使用'click''a'作为参数。任何时候只要有事件冒泡到document节点上,它就查看该事件是否是一个click事件,以及该事件的目标元素与'a'这一CSS选择器是否匹配,如果都是的话,则执行函数。jQuery1.4开始支持在使用.live()方法时配合使用一个上下文参数:


 

 

.delegate() 

 

JQuery扫描文档查找$('#container'),并使用click事件和'a'这一CSS选择器作为参数把alert函数绑定到$('#container')上。任何时候只要有事件冒泡到$('#container')上,它就查看该事件是否是click事件,以及该事件的目标元素是否与CSS选择器相匹配。如果两种检查的结果都为真的话,它就执行函数。(注:如果监听父控件被移除,其响应事件也会失效)可见,.delegate()方法是一个相对完美的解决方案。但在DOM结构简单的情况下,也可以使用.live()。

 

1、这句话是否正确?

   不完全正确,

 

如上面的代码,后者实际上要快过前者,因为前者首先要扫描整个的文档查找所有的$(‘a')元素,把它们存成jQuery对象。尽管live函数仅需要把'a'作为串参数传递以用做之后的判断,但是$()函数并未知道被链接的方法将会是.live()。而另一方面,delegate方法仅需要查找并存储$(document)元素。一种解决的办法为,使用一种“早委托”的方式,如下:

 

在此,(function($){})(jQuery)是一个“立即执行的匿名函数”,构成了一个闭包,可以防止命名冲突。在匿名函数内部,$参数引用jQuery对象。这个匿名函数不会等到DOM就绪就会执行。注意,使用这个hack时,脚本必须是在页面的head元素中执行的,意味着在$(document).reday()之外执行。之所以选择这个时机,因为这时候刚好document元素可用,而整个DOM还远未生成;如果把脚本放在结束的body标签前面,就没有意义了,因为那时候DOM已经完全可用了。

 

 

2、.live()相比.delegate()缺点有哪些?

  一、$()函数会找到当前页面中选择器匹配元素并创建jQuery对象,但在确认事件目标时却不用这个元素集合,而是使用选择符表达式与event.target或其祖先元素进行比较,因而生成这个jQuery对象会造成不必要的开销;

  二、默认把事件绑定到$(document)元素,如果DOM嵌套结构很深,事件冒泡通过大量祖先元素会导致性能损失;

  三、只能放在直接选择的元素后面,不能在连缀的DOM遍历方法后面使用,即$(#infotable td).live…可以,但$(“#infotable).find(td).live…不行;

  四、收集选择器匹配元素并创建jQuery对象,但实际操作的却是$(document)对象,令人费解。

 

3、.live()真的绑定在document上面吗?

   可以绝对的肯定。写一个样例,html代码为:

  测试代码:

 

其测试结果为: ccc > aaa > bbb,和预期相符合

分享到:
评论

相关推荐

    Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解

    在我们日常开发中经常会使用到.bind()、.live()、.delegate()和.on(),有些同学会对这四者存在一些疑虑,所以下面这篇文章主要给大家介绍了关于Jquery中.bind()、.live()、.delegate()和.on()之间区别的相关资料,...

    jQuery中的.bind()、.live()和.delegate()之间区别分析

    jQuery中的.bind()、.live()和.delegate()之间区别分析,学习jquery的朋友可以参考下。

    jQuery中bind(),live(),delegate

    jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解共8页.pdf.zip

    jQuery:bind() delegate() live()事件绑定

    jQuery:bind() delegate() live()事件绑定

    jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解

    本文实例分析了jQuery中bind(),live(),delegate(),on()绑定事件方法。分享给大家供大家参考,具体如下: 前言 因为项目中经常会有利用jquery操作dom元素的增删操作,所以会涉及到dom元素的绑定事件方式,简单的归纳...

    jQuery中bind,live,delegate与one方法的用法及区别解析

    bind( )方法用于将一个处理程序附加到每个匹配元素的事件上并返回jQuery对象。 .bind(eventType[, evnetData], Handler(eventObject)) 其中,参数eventType是一个字符串,包含一个或多个javaScript事件类型,例如...

    jQuery中 delegate使用的问题

    支持为动态生成的标签元素绑定事件也许就live和delegate了吧,不过新版本已经不支持live了,只有delegate delegate真的比较特殊呀,不同于其他事件绑定的风格。 就因为习惯了之前的bind风格..栽了跟头 简单的说就是...

    jquery中绑定事件的异同

    谈论jquery中bind(),live(),delegate(),on()绑定事件方式 1. Bind() $(selector).bind(event,data,function) Event:必须项;添加到元素的一个或多个事件。 Data:可选;需要传递的参数 Function:必需;当绑定事件发生...

    jQuery 1.5 API 中文版

    $.jQuery( selector [, context] ), .jQuery( element ), .jQuery( elementArray ), .jQuery( jQueryObject ), .jQuery( ) $.jQuery( html [, ownerDocument] ), .jQuery( html, props ) $.jQuery( fn ) jQuery ...

    jquery插件使用方法大全

    正如Using Deferreds in jQuery 1.5一文中说明的,其结果是在jQuery中能够将依赖于某个任务(事件)结果的逻辑与任务本身解耦了。这一点在JavaScript中其实并不新鲜,Mochikit和Dojo等已经实现有些日子了。由于...

    jQuery中绑定事件bind() on() live() one()的异同

    live()————————–版本号小于1.7(在Jquery1.7中已经移除,相应die()也移除) delegate()——————-版本号小于1.7(在Jquery1.7中已经移除) on()—————————版本号大于1.7(在Jquery1.7中添加,...

    关于Jquery中的事件绑定总结

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

    读jQuery之十 事件模块概述

    后面会详细分析jQuery.event.add/jQuery.event.remove/jQuery.event.trigger。 虽然事件模块代码很难读,但其提供的API接口还是很清晰的。如下 1 添加事件(bind/one/live/delegate/hover/toggle) bind 基本的添加...

    jquery事件代理方式的区别联系

    事件冒泡的介绍,live delegate bind 的简介及区别。

Global site tag (gtag.js) - Google Analytics