<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Jquery中.bind()、.live()、.delegate()和.on()之間的區(qū)別詳解

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:33:35
        文檔

        Jquery中.bind()、.live()、.delegate()和.on()之間的區(qū)別詳解

        Jquery中.bind()、.live()、.delegate()和.on()之間的區(qū)別詳解:簡介 最近了解到很多網(wǎng)頁開發(fā)者對jquery中的 .bind() .live() .delegate() 和 .on() 方法存在很多的疑惑。這些疑惑通常是關(guān)于它們之間真正的區(qū)別是什么啊,什么時候該使用它們啊。下面本文將給大家詳細介紹這四個方法之間的區(qū)別,分別對每個方法都進行了詳細
        推薦度:
        導(dǎo)讀Jquery中.bind()、.live()、.delegate()和.on()之間的區(qū)別詳解:簡介 最近了解到很多網(wǎng)頁開發(fā)者對jquery中的 .bind() .live() .delegate() 和 .on() 方法存在很多的疑惑。這些疑惑通常是關(guān)于它們之間真正的區(qū)別是什么啊,什么時候該使用它們啊。下面本文將給大家詳細介紹這四個方法之間的區(qū)別,分別對每個方法都進行了詳細

        簡介

        最近了解到很多網(wǎng)頁開發(fā)者對jquery中的 .bind() .live() .delegate() 和 .on() 方法存在很多的疑惑。這些疑惑通常是關(guān)于它們之間真正的區(qū)別是什么啊,什么時候該使用它們啊。下面本文將給大家詳細介紹這四個方法之間的區(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()方法將事件類型和一個事件處理函數(shù)直接注冊到了被選中的DOM元素中。這個方法被使用得最久,在此期間,它很好的解決了各種跨瀏覽器的問題。當使用它來連接事件處理函數(shù)時,它仍然非常簡潔,但是也存在著一些性能方面的問題,將在下面羅列出來。

        /* .bind() 方法將事件類型和一個事件處理函數(shù)直接注冊到了被選中的DOM元素中。 
         .click() 方法只是.bind() 方法的簡寫。
        */
        
        $( "#members li a" ).bind( "click", function( e ) {} ); 
        $( "#members li a" ).click( function( e ) {} ); 

        .bind()方法將會把事件處理函數(shù)連接到所有匹配的a標簽。這種方式并不好。這樣做的話,它不僅在所有匹配的元素中隱含地迭代附加事件處理函數(shù),而且這些操作非常浪費(多余),因為這些相同的事件處理函數(shù)是被一遍一遍的重復(fù)的添加到所有匹配的標簽上。

        優(yōu)點:

      1. 適用于各種瀏覽器
      2. 連接事件處理函數(shù)非常方便快捷
      3. 可以使用 .click() ,  .hover()等簡寫方法來更方面地連接事件處理函數(shù)
      4. 對于一個簡單的ID選擇器,使用.bind() 方法不僅可以很快地連接事件處理函數(shù),而且當事件被觸發(fā)時, 事件處理函數(shù)幾乎是馬上就被調(diào)用了
      5. 缺點:

      6. 這樣方法會將所有的事件處理函數(shù)附加到所有匹配的元素
      7. 不可以動態(tài)地匹配相同選擇器的元素
      8. 當操作大量匹配的元素時會有性能方面的問題
      9. 附加操作是在前期完成的,這可能導(dǎo)致頁面加載時存在性能問題
      10. 使用Live方法

        .live()方法使用了事件委托的概念來實施其所謂的“魔法”。你調(diào)用live()方法的方式就像是調(diào)用bind()方法那樣方便。然而在這表面之下, .live()方法與前者的實現(xiàn)方式大不相同。 .live()方法將與事件處理函數(shù)關(guān)聯(lián)的選擇器和事件信息一起附加到文檔的根級元素(即document)。通過將事件信息注冊到document上,這個事件處理函數(shù)將允許所有冒泡到document的事件調(diào)用它(例如委托型、傳播型事件)。一旦有一個事件冒泡到document元素上,Jquery會根據(jù)選擇器或者事件的元數(shù)據(jù)來決定哪一個事件處理函數(shù)應(yīng)該被調(diào)用,如果這個事件處理函數(shù)存在的話。這個額外的工作將會在用戶交互時對性能方面造成一定的影響,但是初始化注冊事件的過程相當?shù)乜臁?/p>

        /* 方法將與事件處理函數(shù)關(guān)聯(lián)的選擇器和事件信息一起附加到文檔的根級元素(即document) 
         ( "#members li a" & "click" ) */
        
        $( "#members li a" ).live( "click", function( e ) {} );

        .bind()這個例子與上面bind()方法的例子對比的話有一個優(yōu)點在于它僅僅把事件處理函數(shù)附加到document元素一次,而不是很多次。這樣不僅更快,而且還減少了性能的浪費。然而,使用這個方法也會帶來很多問題,下面將一一列出。

        優(yōu)點:

      11. 所有的事件處理函數(shù)都只會被注冊一次,而不是像bind()那樣進行多次注冊
      12. bind()方法升級到live()方法非常方便,你僅需要將"bind"替代為"live"就可以了
      13. 那些被動態(tài)添加到DOM的元素也將被神奇的匹配到,因為真實的事件信息是被注冊到document元素上的
      14. 你可以在文檔加載完之前連接事件處理函數(shù),這樣可以幫助你更好地利用你可能沒有用的時間
      15. 缺點:

      16. 這個方法在Jquery 1.7以后的版本被棄用了,你應(yīng)該在你的代碼里逐步放棄使用它
      17. 使用這個方法時鏈式操作沒有得到正確的支持,可能會出現(xiàn)某些錯誤
      18. 所做的匹配操作基本上沒用因為它只用于在document元素上注冊事件處理函數(shù)
      19. 使用 event.stopPropogation() 方法將會沒用,因為事件總是已經(jīng)被委托到了document元素上
      20. 因為所有的選擇器或者事件信息都被附加到document元素上了,所以一旦有一個事件要調(diào)用某個事件處理函數(shù),Jquery會在一大堆儲存的元數(shù)據(jù)中使用matchesSelector方法來決定哪一個事件處理函數(shù)將會被調(diào)用,如果這個函數(shù)有的話。
      21. 因為你所連接的事件總是被委托到document上,所如果你的DOM的層級很深的話,這會導(dǎo)致一定的性能問題
      22. 使用Delegate方法

        .delegate()方法與live()方式實現(xiàn)方式相類似,它不是將選擇器或者事件信息附加到document,而是讓你指定附加的元素。就像是live()方法一樣,這個方法使用事件委托來正確地工作。

        如果你跳過了前面關(guān)于 .live() 方法的介紹,你可能要回去重新看看它,因為這里涉及到之前我所闡述的一些內(nèi)部邏輯

        /* .delegate() 方法會將選擇器和事件信息 ( "li a" & "click" ) 附加到你指定的元素上 ( "#members" )。
        */
        
        $( "#members" ).delegate( "li a", "click", function( e ) {} );

        .delegate()方法十分強大。在上面這個例子中,與事件處理函數(shù)關(guān)聯(lián)的選擇器和事件信息將會被附加到( #members" )這個元素上。這樣做比使用live()高效多了,因為live()方法總是將與事件處理函數(shù)關(guān)聯(lián)的選擇器和事件信息附加到document元素上。另外,使用.delegate()方法解決許多其他問題。請參閱下方列出的詳細信息。

        優(yōu)點:

      23. 你可以選擇將選擇器或者事件信息附加到指定的元素。
      24. 匹配操作實際上在前面并沒有執(zhí)行,而是用來注冊到指定的元素。
      25. 鏈式操作可以得到正確的支持
      26. Jquery仍然需要迭代這些選擇器或者事件信息來匹配元素,不過因為你可以選擇哪一個元素作為根元素,所以篩選的量會大幅減少
      27. 因為這項技術(shù)使用了事件委托機制,它可以匹配到被動態(tài)地添加到DOM的元素
      28. 你可以在文檔加載完之前連接事件處理函數(shù)
      29. 缺點:

      30. .bind()方法不可以直接升級到.delegate()方法
      31. Jquery仍然需要使用marchesSelector方法在附加到指定根元素的選擇器或者事件信息中篩選決定哪一個事件處理函數(shù)會被調(diào)用。然而,附加到指定根元素的元數(shù)據(jù)會比使用live()方法的時候要小得多。
      32. 當操作大量匹配的元素時會有性能方面的問題
      33. 附加操作是在前期完成的,這可能導(dǎo)致頁面加載時存在性能問題
      34. 使用On方法

        你知道嗎,在Jquery 1.7版本中.bind() .live() .delegate()方法只需要使用.on()方法一種方式來調(diào)用它們。當然.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 );
        }

        考慮到這一點,使用.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)用其他方法。你可以認為.on()方法被具有不同簽名的方法”重載“了,而這些方法實現(xiàn)了不同的事件綁定的連接方式。 .on()方法的出現(xiàn)為API帶來了很多方面的一致性,并希望讓事情變得不那么混亂。

        優(yōu)點:

      35. 使各種事件綁定方法一致。
      36. 因為在Jquery源碼中.bind().live() .delegate()方法實際上是調(diào)用了此方法,因此簡化了jQuery代碼庫并刪除了一級重定向。
      37. 這種方式仍然提供了使用.delegate()方法的優(yōu)點,并且仍然提供對.bind()方法的支持,如果你需要的話。
      38. 缺點:

      39. 給人帶來了一些疑惑,因為方法的實際執(zhí)行方式將根據(jù)你如何調(diào)用方法而改變。
      40. 總結(jié)

        如果你對不同的綁定事件方法有所迷惑,那么不要擔(dān)心,因為API發(fā)展了一段時間了,有很多前人的經(jīng)驗可以借鑒。也有很多人將這些方法視為魔法,不過一旦你了解了他們工作背后的原理,將幫助您了解如何更好地處理項目。
        以下是這篇文章的精華所在...

      41. 使用.bind()方法非常浪費性能因為它把同一個事件處理函數(shù)附加到了每一個匹配的元素上
      42. 你應(yīng)該停止使用.live()方法因為它被棄用了同時也會帶來很多問題
      43. 使用.delegate()方法會給你帶來很多好處當你需要解決一些性能上的問題和對動態(tài)添加的元素作出處理
      44. 新的.on()方法其實就是模擬.bind() , .live() .delegate()實現(xiàn)的語法糖,具體取決于你如何調(diào)用它
      45. 新的方向是使用新的.on()方法。先熟悉語法,并開始在你的所有的Jquery 1.7版本以上的項目使用它吧!
      46. 對于上面列舉的優(yōu)點或者缺點,你有新的補充嗎?你最近開始使用delegate()方法了嗎?你對新的.on()方法怎么看呢?把你的想法寫到用評論告訴我吧!謝謝!

        第一次翻譯,文章中可能會出現(xiàn)一些不通順的地方,希望得到大家的理解,畢竟我還是個學(xué)生??!

        好了,大概就這樣,

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Jquery中.bind()、.live()、.delegate()和.on()之間的區(qū)別詳解

        Jquery中.bind()、.live()、.delegate()和.on()之間的區(qū)別詳解:簡介 最近了解到很多網(wǎng)頁開發(fā)者對jquery中的 .bind() .live() .delegate() 和 .on() 方法存在很多的疑惑。這些疑惑通常是關(guān)于它們之間真正的區(qū)別是什么啊,什么時候該使用它們啊。下面本文將給大家詳細介紹這四個方法之間的區(qū)別,分別對每個方法都進行了詳細
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 美国毛片亚洲社区在线观看| 亚洲电影在线播放| 国产精品亚洲专区无码不卡| 拨牐拨牐x8免费| 亚洲熟女综合色一区二区三区| 57pao国产成视频免费播放 | 九九全国免费视频| 亚洲国产日韩成人综合天堂| 夜夜爽妓女8888视频免费观看| 浮力影院亚洲国产第一页| 国产在线观看无码免费视频| 亚洲va无码va在线va天堂| 午夜免费啪视频在线观看| 亚洲午夜视频在线观看| 日本亚洲免费无线码| 亚洲欧洲专线一区| 日韩精品成人亚洲专区| 男女一边桶一边摸一边脱视频免费| 亚洲精品tv久久久久久久久| 99在线热视频只有精品免费| 精品亚洲成A人无码成A在线观看| 最近最新中文字幕完整版免费高清| 久久亚洲精品11p| 亚洲一区二区三区偷拍女厕| 91香蕉国产线观看免费全集| 亚洲一卡一卡二新区无人区| 免费va在线观看| 久久精品乱子伦免费| 亚洲日韩中文字幕一区| 亚洲 小说区 图片区 都市| 无码专区AAAAAA免费视频| 中文字幕乱码亚洲精品一区| 中文字幕中韩乱码亚洲大片 | 亚洲综合在线一区二区三区| 亚洲va中文字幕无码| 日韩精品无码免费专区网站| 狠狠色香婷婷久久亚洲精品| 久久精品国产亚洲Aⅴ香蕉| 成年人视频免费在线观看| 免费的黄色的网站| 亚洲大香人伊一本线|