JQ中bind(),live(),delegate()事件方法的区别

 jQuery团队在1.7版本中发布了一个用于绑定事件的新方法叫做on。这个方法包含了下面所介绍的live, bind, 和 delegate的功能,允许我们通过传递不同的参数指定绑定事件的方式而不是通过不同的方法名。

基础知识
 
定义和用法

bind() 方法为被选元素添加一个或多个事件处理程序,并规定事件发生时运行的函数。

将事件和函数绑定到元素
规定向被选元素添加的一个或多个事件处理程序,以及当事件发生时运行的函数。

语法

$(selector).bind(event,data,function)

$("button").bind("click",function(){
  $("p").slideToggle();
});

live() 方法为被选元素附加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。

通过 live() 方法附加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素)。

语法
$(selector).live(event,data,function)

$("button").live("click",function(){
  $("p").slideToggle();
});

•.delegate( selector, eventType, handler )
selector选择器字符串,用于过滤器触发事件的元素。

eventType一个包含一个或多个JavaScript事件类型的字符串,比如”click”或”keydown,”或自定义事件的名称。

handler每当事件触发时执行的函数。

•.delegate( selector, eventType, eventData, handler )
selector选择器字符串,用于过滤触发事件的元素。

eventType一个包含一个或多个JavaScript事件类型的字符串,比如”click”或”keydown,”或自定义事件的名称。

 

事件冒泡(事件传递)

当我们点击一个链接,链接元素会发出一个click事件,这个事件会触发那些与该元素click事件绑定的方法。

$('a').bind('click', function() { alert("That tickles!") });如上这段代码,链接点击时会触发一个alert。

 
click事件会沿着树向上传递广播到父元素,所有子元素上触发的事件都会沿树向上传递直到根元素。
 

在HTML的DOM操作中,document是跟节点。

下面我们来看.bind(),.live(), 和 .delegate()之间的区别。

.bind()

$('a').bind('click', function() { alert("That tickles!") });这个是绑定事件处理方法最直接的途径。jQuery遍历document中所有 $(‘a’)元素并将每个元素的click事件绑定alert方法。

.live()

$('a').live('click', function() { alert("That tickles!") });jQuery在 $(document)元素上绑定alert方法,同时将‘click’和‘a’作为参数。当一个事件传递到document节点时,节点会检验事件类型是否为click同时检验事件的目标元素类型是否同选择符‘a’相匹配。如果检验通过那么执行alert方法。

除了document,live方法还可以将方法绑定到指定的元素上,如下:

 代码如下 复制代码

$('a', $('#container')[0]).live(...);.delegate()

$('#container').delegate('a', 'click', function() { alert("That tickles!") });jQuery遍历document检索出 $(‘#container’)元素并绑定alert方法同时将click事件和’a'选择符作为参数。当一个事件传递到 $(‘#container’)时,它检验事件类型是否为click并且目标元素同’a'选择符相符。如果通过检验则执行方法。

这里需要注意这个方法同.live()有些相似,他们的不同之处在于.delegate()方法将方法绑定到特定的元素而.live()绑定到document根元素。也许我们会问 是不是$(‘a’).live() == $(document).delegate(‘a’)?? 答案是否,并不完全相同。

为什么.delegate()比.live()更推荐使用

jQuery的delegate方法同live方法相比有如下几点优势。

 代码如下 复制代码

$('a').live('click', function() { blah() }); // or $(document).delegate('a', 'click', function() { blah() });

速度

如上两种绑定事件的方法效果是相同的。但是第二种方法在执行速度上要快于第一种。因为第一种方法需要从document节点开始检索出所有$(‘a’)元素,并将这些元素保存为jQuery对象。尽管live方法仅需要使用传递的选择符’a’就可以检验出哪些事件需要处理,但是$()方法并不知道它后面所接的方法是.live().

而delegate方法仅查找并保存$(document)元素。

灵活性和代码连续性

live相比起来更复杂。因为虽然它接在$(‘a’)对象之后,但是它实际上是在 $(document)对象上工作。正因为此,它后面所接的方法会难以理解。实际应用中更推荐使用$.live(‘a’,…)以绑定到指定元素上。

只能用CSS选择符

live方法最大的缺点就是它只能直接使用CSS选择符来进行操作,这使得这个方法在使用中非常的不灵活。

关于CSS选择符的缺点参考 Exploring jQuery .live() and .die().

为何推荐使用.live()或.delegate()代替.bind()

从上述来看似乎bind方法使用更清晰更直接,但是考虑以下两点我们更倾向使用live和delegate方法:

•为还不存在的DOM元素绑定事件方法。因为bind直接将方法绑定到独立的元素上,它不能将方法绑定到一个在页面上不存在的元素。因此如果我们执行$(‘a’).bind(…),那些通过AJAX后添加到页面上的链接则不会被绑定。而live和delegate方法是将事件方法绑定到一个指定父节点上,那么这个节点下已经存在的元素或后添加的元素的事件都可以被处理。
•通过为单独元素或一组元素绑定方法监听所有它们的子元素,而不需要通过循环为每个独立的DOM元素绑定相同的方法。将一个方法绑定到一个或一组父元素比直接为页面上的每个元素都绑定方法运行效率要高很多。
终止事件传递

最后关于终止事件传递有一点需要提醒,通常我们可以通过终止事件传递来避免其他事件处理方法的运行:

 代码如下 复制代码

$('a').bind('click', function(e) { e.preventDefault(); // or e.stopPropagation(); });

但是,当我们使用live或delegte方法时,事件处理方法直到事件传递到所绑定的元素时才会真正运行,这时通过.bind()绑定的事件方法其实已经运行了

时间: 2024-12-10 03:46:58

JQ中bind(),live(),delegate()事件方法的区别的相关文章

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

本文实例分析了jQuery中bind(),live(),delegate(),on()绑定事件方法.分享给大家供大家参考,具体如下: 前言 因为项目中经常会有利用jquery操作dom元素的增删操作,所以会涉及到dom元素的绑定事件方式,简单的归纳一下bind,live,delegate,on的区别,以便以后查阅,也希望该文章日后能帮助到各位朋友,文中如有不当之处,还望各位指正,话不多说,直接进入正题. 一.bind() 简要描述 bind()向匹配元素添加一个或多个事件处理器. 使用方式 复制

java线程中 start方法和run方法的区别和联系是什么

问题描述 java线程中 start方法和run方法的区别和联系是什么 java线程中 start方法和run方法的区别和联系是什么 start是启动一个线程到就绪状态 run是运行一个线程 要run一个线程必须先start一个线程,这么理解对不 解决方案 通过start启动线程,内部调用run,如果你直接调用run,就是同步的,会阻塞 解决方案二: run方法里写的是每个线程需要执行的代码 run 只是调用你自己写的run方法而已.根线程调用无关. start才是启动线程的方法 解决方案三:

PrintWriter中write()方法和print()方法的区别?

问题描述 PrintWriter中write()方法和print()方法的区别? 解决方案 共同点:两者都不刷新页面,只在原来的页面写数据.最终都是重写了抽象类Writer里面的write方法.print方法可以将各种类型的数据转换成字符串的形式输出.重载的write方法只能输出字符.字符数组.字符串等与字符相关的数据.解决方案二:查看源码你会看到public void print(Object obj) { write(String.valueOf(obj));}print方法就是调用writ

jquery中prop()方法和attr()方法的区别浅析_基础知识

jquery1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. 大家都知道有的浏览器只要写disabled,checked就可以了,而有的要写成disabled = "disabled",checked="checked",比如用attr("checked")获取checkbox的checked属性时选中的时候可以取到值,值为"checked"但没选中获取值就是un

解析thinkphp中的M()与D()方法的区别_php技巧

D()和M()方法的区别:D和M的区别主要在于M方法不需要创建模型类文件,M方法不会读取模型类,所以默认情况下自动验证是无效的,但是可以通过动态赋值的方式实现而D方法必须有创建模型类.我们可以用下面两种方法去创建一个数据表的映射对象第一种:$Test = D('Test')第二种:$Test = new Model('Test')虽然这两种都可以对数据进行select,insert,delete,udpate操作,在数据验证上有很大的不同,用第一种方式实例一个模型就会有数据检查功能,如果 tit

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

bind( )方法用于将一个处理程序附加到每个匹配元素的事件上并返回jQuery对象. .bind(eventType[, evnetData], Handler(eventObject)) 其中,参数eventType是一个字符串,包含一个或多个javaScript事件类型,例如click,submit或自定义事件的名称,指定多个事件类型时用空格分隔各个类型:eventData为Map类型,给出要传递给事件处理程序的数据,handler指定触发该事件时要执行的函数,eventObject表示事

jQuery中.bind() .live() .delegate() .on()的差别

差别: .bind()是直接绑定在元素上 .live()则是通过冒泡的方式来绑定到元素上的.更适合列表类型的,绑定到document DOM节点上.和.bind()的优势是支持动态数据. .delegate()则是更精确的小范围使用事件代理,性能优于.live() .on()则是最新的1.9版本整合了之前的三种方式的新事件绑定机制 例子 bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数  代码如下 复制代码 $("a").bind("clic

Android中三种注入事件方法比较_Android

方法1:使用内部APIs 该方法和其他所有内部没有向外正式公布的APIs一样存在它自己的风险.原理是通过获得WindowManager的一个实例来访问injectKeyEvent/injectPointerEvent这两个事件注入方法. 复制代码 代码如下: IBinder wmbinder = ServiceManager.getService( "window" ); IWindowManager m_WndManager = IWindowManager.Stub.asInter

Android中三种注入事件方法比较

方法1:使用内部APIs 该方法和其他所有内部没有向外正式公布的APIs一样存在它自己的风险.原理是通过获得WindowManager的一个实例来访问injectKeyEvent/injectPointerEvent这两个事件注入方法. 复制代码 代码如下: IBinder wmbinder = ServiceManager.getService( "window" ); IWindowManager m_WndManager = IWindowManager.Stub.asInter