成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 前端
jQuery的.bind()、.live()和.delegate()之間的區(qū)別并非總是那么明顯的,然而,如果我們對所有的不同之處都有清晰的理解的話,那么這將會有助于我們編寫出更加簡潔的代碼,以及防止在交互應(yīng)用中彈出錯誤。

基本要素

jQuery 

51CTO推薦專題:jQuery從入門到精通

DOM樹

首先,可視化一個HMTL文檔的DOM樹是很有幫助的。一個簡單的HTML頁面看起來就像是這個樣子:

jQuery

事件冒泡(又稱事件傳播)

當(dāng)我們點擊一個鏈接時,其觸發(fā)了鏈接元素的單擊事件,該事件則引發(fā)任何我們已綁定到該元素的單擊事件上的函數(shù)的執(zhí)行。

  1. $('a').bind('click'function() { alert("That tickles!") }); 

因此一個單擊操作會觸發(fā)alert函數(shù)的執(zhí)行。

jQuery

click事件接著會向樹的根方向傳播,廣播到父元素,然后接著是每個祖先元素,只要是它的某個后代元素上的單擊事件被觸發(fā),事件就會傳給它。

jQuery

在操縱DOM的語境中,document是根節(jié)點。

現(xiàn)在我們可以較容易地說明.bind()、.live()和.delegate()的不同之處了。

.bind()

  1. $('a').bind('click'function() { alert("That tickles!") }); 

這是最簡單的綁定方法了。JQuery掃描文檔找出所有的$(‘a’)元素,并把alert函數(shù)綁定到每個元素的click事件上。

.live()

  1. $('a').live('click'function() { alert("That tickles!") }); 

JQuery把alert函數(shù)綁定到$(document)元素上,并使用’click’和’a’作為參數(shù)。任何時候只要有事件冒泡到document節(jié)點上,它就查看該事件是否是一個click事件,以及該事件的目標元素與’a’這一CSS選擇器是否匹配,如果都是的話,則執(zhí)行函數(shù)。

live方法還可以被綁定到具體的元素(或“context”)而不是document上,像這樣:

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

.delegate()

  1. $('#container').delegate('a''click'function() { alert("That tickles!") }); 

JQuery掃描文檔查找$(‘#container’),并使用click事件和’a’這一CSS選擇器作為參數(shù)把alert函數(shù)綁定到$(‘#container’)上。任何時候只要有事件冒泡到$(‘#container’)上,它就查看該事件是否是click事件,以及該事件的目標元素是否與CCS選擇器相匹配。如果兩種檢查的結(jié)果都為真的話,它就執(zhí)行函數(shù)。

可以注意到,這一過程與.live()類似,但是其把處理程序綁定到具體的元素而非document這一根上。精明的JS’er們可能會做出這樣的結(jié)論,即$('a').live() == $(document).delegate('a'),是這樣嗎?嗯,不,不完全是。

為什么.delegate()要比.live()好用

基于幾個原因,人們通常更愿意選用jQuery的delegate方法而不是live方法。考慮下面的例子:

  1. $('a').live('click'function() { blah() });  
  2.  
  3. // 或者  
  4.  
  5. $(document).delegate('a''click'function() { blah() }); 

速度

后者實際上要快過前者,因為前者首先要掃描整個的文檔查找所有的$(‘a’)元素,把它們存成jQuery對象。盡管live函數(shù)僅需要把’a’作為串參數(shù)傳遞以用做之后的判斷,但是$()函數(shù)并未“知道”被鏈接的方法將會是.live()。

而另一方面,delegate方法僅需要查找并存儲$(document)元素。

一種尋求避開這一問題的方法是調(diào)用在$(document).ready()之外綁定的live,這樣它就會立即執(zhí)行。在這種方式下,其會在DOM獲得填充之前運行,因此就不會查找元素或是創(chuàng)建jQuery對象了。

靈活性和鏈能力

live函數(shù)也挺令人費解的。想想看,它被鏈到$(‘a’)對象集上,但其實際上是在$(document)對象上發(fā)生作用。由于這個原因,它能夠試圖以一種嚇死人的方式來把方法鏈到自身上。實際上,我想說的是,以$.live(‘a’,…)這一形式作為一種全局性的jQuery方法,live方法會更具意義一些。

僅支持CSS選擇器

***一點,live方法有一個非常大的缺點,那就是它僅能針對直接的CSS選擇器做操作,這使得它變得非常的不靈活。

欲了解更多關(guān)于CSS選擇器的缺點,請參閱Exploring jQuery .live() and .die()一文。

更新:感謝Hacker News上的pedalpete和后面評論中的Ellsass提醒我加入接下來的這一節(jié)內(nèi)容。

為什么選擇.live()或.delegate()而不是.bind()

畢竟,bind看起來似乎更加的明確和直接,難道不是嗎?嗯,有兩個原因讓我們更愿意選擇delegate或live而不是bind:

Ÿ 為了把處理程序附加到可能還未存在于DOM中的DOM元素之上。因為bind是直接把處理程序綁定到各個元素上,它不能把處理程序綁定到還未存在于頁面中的元素之上。

Ÿ 如果你運行了$(‘a’).bind(…),而后新的鏈接經(jīng)由AJAX加入到了頁面中,則你的bind處理程序?qū)τ谶@些新加入的鏈接來說是無效的。而另一方面live和delegate則是被綁定到另一個祖先節(jié)點上,因此其對于任何目前或是將來存在于該祖先元素之內(nèi)的元素都是有效的。

Ÿ 或者為了把處理程序附加到單個元素上或是一小組元素之上,監(jiān)聽后代元素上的事件而不是循環(huán)遍歷并把同一個函數(shù)逐個附加到DOM中的100個元素上。把處理程序附加到一個(或是一小組)祖先元素上而不是直接把處理程序附加到頁面中的所有元素上,這種做法帶來了性能上的好處。

停止傳播

***一個我想做的提醒與事件傳播有關(guān)。通常情況下,我們可以通過使用這樣的事件方法來終止處理函數(shù)的執(zhí)行:

  1. $('a').bind('click'function(e) {  
  2. e.preventDefault();  
  3. // 或者  
  4. e.stopPropagation();  
  5. });  

不過,當(dāng)我們使用live或是delegate方法的時候,處理函數(shù)實際上并沒有在運行,需要等到事件冒泡到處理程序?qū)嶋H綁定的元素上時函數(shù)才會運行。而到此時為止,我們的其他的來自.bind()的處理函數(shù)早已運行了。
 

【編輯推薦】

  1. 分享7個用jQuery重寫的經(jīng)典在線小游戲
  2. 25個超棒的jQuery日歷和日期選取插件
  3. 在jQuery 1.5中使用deferred對象
  4. HTML 5聯(lián)手jQuery實現(xiàn)超酷圖像灰度漸變效果
  5. jQuery異步調(diào)用頁面后臺實例分析
責(zé)任編輯:陳貽新 來源: 譯言網(wǎng)
相關(guān)推薦

2024-03-15 08:21:17

bindJavaScrip函數(shù)

2021-02-14 10:06:54

RPAAICIO

2020-06-09 07:00:00

RHELCentOSFedora

2009-01-19 13:35:57

ETLEAI數(shù)據(jù)倉庫

2023-03-29 08:35:11

RMANBackupSets

2023-05-11 07:41:03

Java 8tMap方法

2022-09-14 11:17:13

云計算邊緣計算

2024-08-20 16:04:27

JavaScript開發(fā)

2018-02-28 11:34:20

2018-05-21 21:26:59

Apache HiveHbaseSQL

2021-01-29 15:10:32

機器學(xué)習(xí)

2012-04-27 09:24:44

程序員編碼員

2022-04-07 16:03:36

JavaScriptTypeScript

2009-07-30 15:09:44

asp.net中Bin

2021-01-11 11:56:22

Apt 應(yīng)用程序

2011-07-13 18:00:51

CC++VC

2022-11-18 16:10:03

云計算虛擬機

2011-07-28 15:30:27

組策略注冊表

2021-12-01 22:55:45

人工智能機器學(xué)習(xí)深度學(xué)習(xí)

2020-09-08 11:00:00

IaaSPaaSSaaS
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美国产日韩一区二区三区 | 99精品电影| 亚洲成人精品免费 | 99亚洲精品 | 久久久久久黄 | 欧美一区二区三区国产精品 | 成人av在线播放 | 欧美日韩成人在线 | 97国产在线观看 | 欧美日韩一二三区 | 中文字幕 国产精品 | 亚洲成人综合网站 | 99国产精品久久久 | 国产成人精品一区二区三区视频 | 国产欧美日韩视频 | 一区中文字幕 | 欧美激情 亚洲 | 国产欧美日韩视频 | 国产亚洲精品美女久久久久久久久久 | 色小姐综合网 | 国产精品一区二区视频 | 国产精品无 | 欧美精品一区二区蜜桃 | 福利成人 | 在线观看国产精品视频 | 成人网在线| 第一色在线 | 亚洲精品一级 | 欧美一区二区三区 | 亚洲精品二区 | 国产成人精品999在线观看 | 天堂一区二区三区 | 久久久国产精品 | 国产精品高潮呻吟久久av野狼 | 欧美日韩成人影院 | 日干夜干 | 亚洲精品天堂 | 亚洲成人久久久 | 丁香综合 | 免费在线看黄 | 成人精品一区二区三区 |