• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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()之間的區別詳解

    來源:懂視網 責編:小采 時間:2020-11-27 22:33:35
    文檔

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

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

    簡介

    最近了解到很多網頁開發者對jquery中的 .bind() .live() .delegate() 和 .on() 方法存在很多的疑惑。這些疑惑通常是關于它們之間真正的區別是什么啊,什么時候該使用它們啊。下面本文將給大家詳細介紹這四個方法之間的區別,分別對每個方法都進行了詳細的介紹,話不多說,來一起看看詳細的介紹:

    在我們深入了解這些方法之前,我們先來一段常見的的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()方法將事件類型和一個事件處理函數直接注冊到了被選中的DOM元素中。這個方法被使用得最久,在此期間,它很好的解決了各種跨瀏覽器的問題。當使用它來連接事件處理函數時,它仍然非常簡潔,但是也存在著一些性能方面的問題,將在下面羅列出來。

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

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

    優點:

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

  • 這樣方法會將所有的事件處理函數附加到所有匹配的元素
  • 不可以動態地匹配相同選擇器的元素
  • 當操作大量匹配的元素時會有性能方面的問題
  • 附加操作是在前期完成的,這可能導致頁面加載時存在性能問題
  • 使用Live方法

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

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

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

    優點:

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

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

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

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

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

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

    優點:

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

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

    你知道嗎,在Jquery 1.7版本中.bind() , .live() .delegate()方法只需要使用.on()方法一種方式來調用它們。當然.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()`方法一種方式來調用它們 */
    
    // 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()方法決定了它如何調用其他方法。你可以認為.on()方法被具有不同簽名的方法”重載“了,而這些方法實現了不同的事件綁定的連接方式。 .on()方法的出現為API帶來了很多方面的一致性,并希望讓事情變得不那么混亂。

    優點:

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

  • 給人帶來了一些疑惑,因為方法的實際執行方式將根據你如何調用方法而改變。
  • 總結

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

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

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

    好了,大概就這樣,

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

    文檔

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

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 日韩精品国产自在欧美| 亚洲精品老司机在线观看| 国内精品国语自产拍在线观看| 日韩精品无码永久免费网站| 日本精品久久久中文字幕 | 亚洲国产精品无码久久98| 国内精品91最新在线观看| 一夲道无码人妻精品一区二区 | 国产成人精品一区二区三区免费| 亚欧无码精品无码有性视频| 国产精品VIDEOSSEX久久发布| 91精品国产91久久久久福利| 亚洲精品乱码久久久久久| 久久综合精品国产一区二区三区| 91自慰精品亚洲| 国产精品91av| 国内精品伊人久久久久AV影院| 欧美精品免费专区在线观看| 99精品视频在线观看婷| 久久精品国产半推半就| 99爱在线精品免费观看| 久久久一本精品99久久精品66| 四虎影院国产精品| 免费精品国自产拍在线播放| 国产精品日韩欧美久久综合 | 91热成人精品国产免费| 国产精品v欧美精品v日韩精品| 久久久精品人妻一区二区三区蜜桃| 四虎影视永久在线精品免费| 欧美国产精品va在线观看| 国产精品主播一区二区| 中文精品一卡2卡3卡4卡| 国内精品在线视频| 久久免费精品视频| 久久亚洲精品中文字幕三区| 久久精品国产亚洲网站| 国内精品51视频在线观看| 久久亚洲欧美日本精品| 久久久91精品国产一区二区三区 | 欧美精品一区二区三区在线| 精品福利一区二区三|