jQuery中的.bind()、.live()和.delegate()之間區(qū)別分析

$('a').bind('click',function(){alert('that tickles!')})


.bind()
這是最簡(jiǎn)單的綁定方法了。JQuery掃描文檔找出所有的$(‘a(chǎn)')元素,并把a(bǔ)lert函數(shù)綁定到每個(gè)元素的click事件上。
.live()
JQuery把a(bǔ)lert函數(shù)綁定到$(document)元素上,并使用'click'和'a'作為參數(shù)。任何時(shí)候只要有事件冒泡到document節(jié)點(diǎn)上,它就查看該事件是否是一個(gè)click事件,以及該事件的目標(biāo)元素與'a'這一CSS選擇器是否匹配,如果都是的話(huà),則執(zhí)行函數(shù)。
live方法還可以被綁定到具體的元素(或“context”)而不是document上,像這樣:
.delegate()
JQuery掃描文檔查找$('#container'),并使用click事件和'a'這一CSS選擇器作為參數(shù)把a(bǔ)lert函數(shù)綁定到$('#container')上。任何時(shí)候只要有事件冒泡到$('#container')上,它就查看該事件是否是click事件,以及該事件的目標(biāo)元素是否與CSS選擇器相匹配。如果兩種檢查的結(jié)果都為真的話(huà),它就執(zhí)行函數(shù)。
可以注意到,這一過(guò)程與.live()類(lèi)似,但是其把處理程序綁定到具體的元素而非document這一根上。精明的JS'er們可能會(huì)做出這樣的結(jié)論,即$('a').live() == $(document).delegate('a'),是這樣嗎?嗯,不,不完全是。
為什么.delegate()要比.live()好用
基于幾個(gè)原因,人們通常更愿意選用jQuery的delegate方法而不是live方法??紤]下面的例子:
或
$(document).delegate('a', 'click', function() { blah() });
后者實(shí)際上要快過(guò)前者,因?yàn)榍罢呤紫纫獟呙枵麄€(gè)的文檔查找所有的$(‘a(chǎn)')元素,把它們存成jQuery對(duì)象。盡管live函數(shù)僅需要把'a'作為串參數(shù)傳遞以用做之后的判斷,但是$()函數(shù)并未“知道”被鏈接的方法將會(huì)是.live()。
而另一方面,delegate方法僅需要查找并存儲(chǔ)$(document)元素。
一種尋求避開(kāi)這一問(wèn)題的方法是調(diào)用在$(document).ready()之外綁定的live,這樣它就會(huì)立即執(zhí)行。在這種方式下,其會(huì)在DOM獲得填充之前運(yùn)行,因此就不會(huì)查找元素或是創(chuàng)建jQuery對(duì)象了。
$('a').bind('click',function(e){
e.preventDefault()
e.stopPropagation()}
)
不過(guò),當(dāng)我們使用live或是delegate方法的時(shí)候,處理函數(shù)實(shí)際上并沒(méi)有在運(yùn)行,需要等到事件冒泡到處理程序?qū)嶋H綁定的元素上時(shí)函數(shù)才會(huì)運(yùn)行。而到此時(shí)為止,我們的其他的來(lái)自.bind()的處理函數(shù)早已運(yùn)行了。
- jQuery事件綁定.on()簡(jiǎn)要概述及應(yīng)用
- jquery移除、綁定、觸發(fā)元素事件使用示例詳解
- JQuery中綁定事件(bind())和移除事件(unbind())
- JQuery中Bind()事件用法分析
- jQuery事件綁定on()、bind()與delegate() 方法詳解
- Query中click(),bind(),live(),delegate()的區(qū)別
- 讓IE8瀏覽器支持function.bind()方法
- 淺談javascript中call()、apply()、bind()的用法
- jQuery綁定事件方法及區(qū)別(bind,click,on,live,one)
相關(guān)文章
JQuery 自定義CircleAnimation,Animate方法學(xué)習(xí)筆記
最近對(duì)看了一些JQuery的基礎(chǔ)教程,被JQuery深深的吸引住了,以前用過(guò)Extjs,看了JQuery不禁感嘆,javascript還能這么些,真是太神奇了!2011-07-07jquery 提示信息顯示后自動(dòng)消失的具體實(shí)現(xiàn)
讓提示信息顯示后自動(dòng)消失的方法有很多,在本文為大家介紹下使用jquery是如何做到的,感興趣朋友可以參考下2013-12-12通過(guò)jquery 獲取URL參數(shù)并進(jìn)行轉(zhuǎn)碼
本節(jié)主要介紹了通過(guò)jquery 獲取URL參數(shù)并進(jìn)行轉(zhuǎn)碼,需要的朋友可以參考下2014-08-08根據(jù)Bootstrap Paginator改寫(xiě)的js分頁(yè)插件
本文主要對(duì)根據(jù)Bootstrap Paginator改寫(xiě)的js插件進(jìn)行詳細(xì)介紹,具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧2016-12-12jquery實(shí)現(xiàn)的元素的left增加N像素 鼠標(biāo)移開(kāi)會(huì)慢慢的移動(dòng)到原來(lái)的位置
鼠標(biāo)移動(dòng)上去,元素的left增加N像素,鼠標(biāo)移開(kāi)會(huì)慢慢的移動(dòng)到原來(lái)的位置2010-03-03基于jquery的button默認(rèn)enter事件(回車(chē)事件)。
這里我介紹一下,button按鈕默認(rèn)回車(chē)(enter)事件。如果大家可以用submit,就不用看以下代碼,因?yàn)閟ubmit可以直接默認(rèn)回車(chē)事件(enter)2011-05-05jQuery中Ajax全局事件引用方式及各個(gè)事件(全局/局部)執(zhí)行順序
這篇文章主要介紹了jQuery中Ajax全局事件引用方式及各個(gè)事件(全局/局部)執(zhí)行順序的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-06-06jQuery中filter(),not(),split()使用方法
jQuery下一些查找過(guò)濾功能filter(),not(),split()用法,可以讓jquery更容易的操作控制頁(yè)面元素。2010-07-07jquery tools系列 expose 學(xué)習(xí)
不知不覺(jué),已經(jīng)進(jìn)行到了jquery tools六大功能的第五個(gè)功能——expose的學(xué)習(xí)了,廢話(huà)不多說(shuō),直接進(jìn)入正題。2009-09-09