[jQuery] 谈一下Jquery中的bind(),live(),delegate(),on()的区别?
生活随笔
收集整理的這篇文章主要介紹了
[jQuery] 谈一下Jquery中的bind(),live(),delegate(),on()的区别?
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
[jQuery] 談一下Jquery中的bind(),live(),delegate(),on()的區(qū)別?
在我們深入了解這些方法之前,我們先來一段常見的的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()方法將事件類型和一個(gè)事件處理函數(shù)直接注冊(cè)到了被選中的DOM元素中。這個(gè)方法被使用得最久,在此期間,它很好的解決了各種跨瀏覽器的問題。當(dāng)使用它來連接事件處理函數(shù)時(shí),它仍然非常簡(jiǎn)潔,但是也存在著一些性能方面的問題,將在下面羅列出來。/* .bind() 方法將事件類型和一個(gè)事件處理函數(shù)直接注冊(cè)到了被選中的DOM元素中。 .click() 方法只是.bind() 方法的簡(jiǎn)寫。 */$( "#members li a" ).bind( "click", function( e ) {} ); $( "#members li a" ).click( function( e ) {} );.bind()方法將會(huì)把事件處理函數(shù)連接到所有匹配的a標(biāo)簽。這種方式并不好。這樣做的話,它不僅在所有匹配的元素中隱含地迭代附加事件處理函數(shù),而且這些操作非常浪費(fèi)(多余),因?yàn)檫@些相同的事件處理函數(shù)是被一遍一遍的重復(fù)的添加到所有匹配的標(biāo)簽上。優(yōu)點(diǎn):適用于各種瀏覽器連接事件處理函數(shù)非常方便快捷可以使用 .click() , .hover()等簡(jiǎn)寫方法來更方面地連接事件處理函數(shù)對(duì)于一個(gè)簡(jiǎn)單的ID選擇器,使用.bind() 方法不僅可以很快地連接事件處理函數(shù),而且當(dāng)事件被觸發(fā)時(shí), 事件處理函數(shù)幾乎是馬上就被調(diào)用了缺點(diǎn):這樣方法會(huì)將所有的事件處理函數(shù)附加到所有匹配的元素不可以動(dòng)態(tài)地匹配相同選擇器的元素當(dāng)操作大量匹配的元素時(shí)會(huì)有性能方面的問題附加操作是在前期完成的,這可能導(dǎo)致頁面加載時(shí)存在性能問題使用Live方法.live()方法使用了事件委托的概念來實(shí)施其所謂的“魔法”。你調(diào)用live()方法的方式就像是調(diào)用bind()方法那樣方便。然而在這表面之下, .live()方法與前者的實(shí)現(xiàn)方式大不相同。 .live()方法將與事件處理函數(shù)關(guān)聯(lián)的選擇器和事件信息一起附加到文檔的根級(jí)元素(即document)。通過將事件信息注冊(cè)到document上,這個(gè)事件處理函數(shù)將允許所有冒泡到document的事件調(diào)用它(例如委托型、傳播型事件)。一旦有一個(gè)事件冒泡到document元素上,Jquery會(huì)根據(jù)選擇器或者事件的元數(shù)據(jù)來決定哪一個(gè)事件處理函數(shù)應(yīng)該被調(diào)用,如果這個(gè)事件處理函數(shù)存在的話。這個(gè)額外的工作將會(huì)在用戶交互時(shí)對(duì)性能方面造成一定的影響,但是初始化注冊(cè)事件的過程相當(dāng)?shù)乜臁?* 方法將與事件處理函數(shù)關(guān)聯(lián)的選擇器和事件信息一起附加到文檔的根級(jí)元素(即document) ( "#members li a" & "click" ) */$( "#members li a" ).live( "click", function( e ) {} );.bind()這個(gè)例子與上面bind()方法的例子對(duì)比的話有一個(gè)優(yōu)點(diǎn)在于它僅僅把事件處理函數(shù)附加到document元素一次,而不是很多次。這樣不僅更快,而且還減少了性能的浪費(fèi)。然而,使用這個(gè)方法也會(huì)帶來很多問題,下面將一一列出。優(yōu)點(diǎn):所有的事件處理函數(shù)都只會(huì)被注冊(cè)一次,而不是像bind()那樣進(jìn)行多次注冊(cè)將bind()方法升級(jí)到live()方法非常方便,你僅需要將"bind"替代為"live"就可以了那些被動(dòng)態(tài)添加到DOM的元素也將被神奇的匹配到,因?yàn)檎鎸?shí)的事件信息是被注冊(cè)到document元素上的你可以在文檔加載完之前連接事件處理函數(shù),這樣可以幫助你更好地利用你可能沒有用的時(shí)間缺點(diǎn):這個(gè)方法在Jquery 1.7以后的版本被棄用了,你應(yīng)該在你的代碼里逐步放棄使用它使用這個(gè)方法時(shí)鏈?zhǔn)讲僮鳑]有得到正確的支持,可能會(huì)出現(xiàn)某些錯(cuò)誤所做的匹配操作基本上沒用因?yàn)樗挥糜谠赿ocument元素上注冊(cè)事件處理函數(shù)使用 event.stopPropogation() 方法將會(huì)沒用,因?yàn)槭录偸且呀?jīng)被委托到了document元素上因?yàn)樗械倪x擇器或者事件信息都被附加到document元素上了,所以一旦有一個(gè)事件要調(diào)用某個(gè)事件處理函數(shù),Jquery會(huì)在一大堆儲(chǔ)存的元數(shù)據(jù)中使用matchesSelector方法來決定哪一個(gè)事件處理函數(shù)將會(huì)被調(diào)用,如果這個(gè)函數(shù)有的話。因?yàn)槟闼B接的事件總是被委托到document上,所如果你的DOM的層級(jí)很深的話,這會(huì)導(dǎo)致一定的性能問題使用Delegate方法.delegate()方法與live()方式實(shí)現(xiàn)方式相類似,它不是將選擇器或者事件信息附加到document,而是讓你指定附加的元素。就像是live()方法一樣,這個(gè)方法使用事件委托來正確地工作。如果你跳過了前面關(guān)于 .live() 方法的介紹,你可能要回去重新看看它,因?yàn)檫@里涉及到之前我所闡述的一些內(nèi)部邏輯/* .delegate() 方法會(huì)將選擇器和事件信息 ( "li a" & "click" ) 附加到你指定的元素上 ( "#members" )。 */$( "#members" ).delegate( "li a", "click", function( e ) {} );.delegate()方法十分強(qiáng)大。在上面這個(gè)例子中,與事件處理函數(shù)關(guān)聯(lián)的選擇器和事件信息將會(huì)被附加到( #members" )這個(gè)元素上。這樣做比使用live()高效多了,因?yàn)閘ive()方法總是將與事件處理函數(shù)關(guān)聯(lián)的選擇器和事件信息附加到document元素上。另外,使用.delegate()方法解決許多其他問題。請(qǐng)參閱下方列出的詳細(xì)信息。優(yōu)點(diǎn):你可以選擇將選擇器或者事件信息附加到指定的元素。匹配操作實(shí)際上在前面并沒有執(zhí)行,而是用來注冊(cè)到指定的元素。鏈?zhǔn)讲僮骺梢缘玫秸_的支持Jquery仍然需要迭代這些選擇器或者事件信息來匹配元素,不過因?yàn)槟憧梢赃x擇哪一個(gè)元素作為根元素,所以篩選的量會(huì)大幅減少因?yàn)檫@項(xiàng)技術(shù)使用了事件委托機(jī)制,它可以匹配到被動(dòng)態(tài)地添加到DOM的元素你可以在文檔加載完之前連接事件處理函數(shù)缺點(diǎn):從.bind()方法不可以直接升級(jí)到.delegate()方法Jquery仍然需要使用marchesSelector方法在附加到指定根元素的選擇器或者事件信息中篩選決定哪一個(gè)事件處理函數(shù)會(huì)被調(diào)用。然而,附加到指定根元素的元數(shù)據(jù)會(huì)比使用live()方法的時(shí)候要小得多。當(dāng)操作大量匹配的元素時(shí)會(huì)有性能方面的問題附加操作是在前期完成的,這可能導(dǎo)致頁面加載時(shí)存在性能問題使用On方法你知道嗎,在Jquery 1.7版本中.bind() , .live() 和.delegate()方法只需要使用.on()方法一種方式來調(diào)用它們。當(dāng)然.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 ); }考慮到這一點(diǎn),使用.on()方法看起來像以下方式一樣.../* Jquery的 .bind() , .live() 和 .delegate() 方法只需要使用`.on()`方法一種方式來調(diào)用它們 */// 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()方法決定了它如何調(diào)用其他方法。你可以認(rèn)為.on()方法被具有不同簽名的方法”重載“了,而這些方法實(shí)現(xiàn)了不同的事件綁定的連接方式。 .on()方法的出現(xiàn)為API帶來了很多方面的一致性,并希望讓事情變得不那么混亂。優(yōu)點(diǎn):使各種事件綁定方法一致。因?yàn)樵贘query源碼中.bind() , .live() 和.delegate()方法實(shí)際上是調(diào)用了此方法,因此簡(jiǎn)化了jQuery代碼庫并刪除了一級(jí)重定向。這種方式仍然提供了使用.delegate()方法的優(yōu)點(diǎn),并且仍然提供對(duì).bind()方法的支持,如果你需要的話。缺點(diǎn):給人帶來了一些疑惑,因?yàn)榉椒ǖ膶?shí)際執(zhí)行方式將根據(jù)你如何調(diào)用方法而改變。個(gè)人簡(jiǎn)介
我是歌謠,歡迎和大家一起交流前后端知識(shí)。放棄很容易,
但堅(jiān)持一定很酷。歡迎大家一起討論
主目錄
與歌謠一起通關(guān)前端面試題
總結(jié)
以上是生活随笔為你收集整理的[jQuery] 谈一下Jquery中的bind(),live(),delegate(),on()的区别?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java udp server_实现ja
- 下一篇: 音视频即时通讯解决方案