jQuery綁定事件的四種方式:bind、live、delegate、on


1、jQuery操作DOM元素的綁定事件的四種方式

  jQuery中提供了四種事件監聽方式,分別是bind、live、delegate、on,對應的解除監聽的函數分別是unbind、die、undelegate、off。

2、必備的基礎知識: DOM樹

  示例,這是在browser環境下的一棵模擬DOM樹:

HTML DOM Structure

  

  我們的頁面可以理解為一棵DOM樹,當我們在葉子結點上做什么事情的時候(如click一個a元素),如果我們沒有人為的設置stopPropagation(Moder Browser),  

  cancelBubble(IE), //阻止傳播(現代的瀏覽器),取消冒泡(ie瀏覽器),那么它的所有父元素,祖宗元素都會受之影響,綁定的事件也對它們產生作用。

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

  當我們點擊a,首先會觸發它本身所綁定的click事件,然后會一路往上,觸發它的父元素,祖先元素上所有綁定的click事件:

HTML DOM Structure

3、bind

  $(selector).bind(event,data,function)

  event:事件,必選,一個或多個事件;  data:參數,可選;  fn:綁定事件發生時執行的函數,必選。

  bind()是最直接的、存在最久的綁定方法。

  優點:這個方法提供了一種在不同瀏覽器中對事件處理的兼容性解決方案。

  缺點:它會綁定事件到所有的目標元素上,有一個綁一個,在頁面上的元素不會動態添加的時候使用它沒什么問題。

       但如果列表中動態增加一個“列表元素5”,點擊它是沒有反應的,必須再bind一次才行。也就是說,它不會綁定到在它執行完后動態添加的那些元素上。

     當元素很多時,會出現效率問題。當頁面加載完的時候,你才可以進行bind(),所以可能產生效率問題。

4、live

  $(selector).live(event,data,function)

  這個方法用到了事件委托的概念來處理事件的綁定。

  優點:這里僅有一次的事件綁定,綁定到document上而不像.bind()那樣給所有的元素挨個綁定。

       那些動態添加的元素依然可以觸發那些早先綁定的事件,因為事件真正的綁定是在document上

     你可以在document ready之前就可以綁定那些需要的事件。

5、delegate

  $(selector).delegate(childSelector,event,data,function)

  childSelector:selector的子元素,必需項。

  delegate()有點像live(),不同於.live()的地方在於,它不會把所有的event全部綁定到document,而是由你決定把它放在哪兒。

  優點:你可以選擇你把這個事件放到那個元素上了。

         需要迭代查找所有的selector/event data來決定那個子元素來匹配,但是因為你可以決定放在那個根元素上,所以可以有效的減小你所要查找的元素。

     可以用在動態添加的元素上。

  缺點:需要查找綁定的子元素,盡管比document少很多了,不過,你還是得浪費時間來查找。

6、on

  其實.bind(), .live(), .delegate()都是通過.on()來實現的,.unbind(), .die(), .undelegate(),也是一樣的都是通過.off()來實現的,

    優點:提供了一種統一綁定事件的方法。

  缺點:也許會對你產生一些困擾,因為它隱藏了前面我們所介紹的三種方法的細節。

7、四種方式的異同和優缺點

  相同點:1.都支持單元素多事件的綁定;空格相隔方式或者大括號替代方式;

       2.均是通過事件冒泡方式,將事件傳遞到document進行事件的響應;

  比較和聯系:

      1.bind()函數只能針對已經存在的元素進行事件的設置;但是live(),on(),delegate()均支持對未來新添加元素的事件設置;

      2.bind()支持Jquery所有版本;live()支持jquery1.8-;delegate()支持jquery1.4.2+;on()支持jquery1.7+;

       bind()函數在jquery1.7版本以前比較受推崇,1.7版本出來之后,官方已經不推薦用bind(),替代函數為on(),這也是1.7版本新添加的函數,

       同樣,可以用來代替live()函數,live()函數在1.9版本已經刪除;

       3.live()函數和delegate()函數兩者類似,但是live()函數在執行速度,靈活性和CSS選擇器支持方面較delegate()差些;

8、結論

      用.bind()的代價是非常大的,它會把相同的一個事件處理程序hook到所有匹配的DOM元素上。【bind:直接綁定到元素上,有一個綁一個。

      不要再用.live()了,它已經不再被推薦了。

      .delegate()會提供很好的方法來提高效率,同時我們可以添加到動態創建的元素上。

       .on()是整合了之前的3種方式的新事件綁定機制,我們可以用.on()來代替上述的3種方法。

 9、綁定多事件的處理

      單事件處理:例如 $(selector).bind("click",data,function);

      多事件處理:

          1.利用空格分隔多事件,例如 $(selector).bind("click dbclick mouseout",data,function);

            2.利用大括號靈活定義多事件,例如 $(selector).bind({event1:function, event2:function, ...})          

         空格相隔方式:綁定較為死板,不能給事件單獨綁定函數,適合處理多個事件調用同一函數的情況;

       大括號替代方式:綁定較為靈活,可以給事件單獨綁定函數。 

 

參考文獻:

  http://www.cnblogs.com/xilipu31/p/4105794.html

  http://blog.csdn.net/panfang/article/details/21705681

  http://www.cnblogs.com/piercalex/archive/2013/03/30/2990679.html

  http://www.51edu.com/it/bckf/35687.html

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM