天天看點

如何用jQuery綁定事件到動态建立的元素上

jQuery最常用的一個功能就是對DOM的操作,與之相關的比如對事件的綁定和Ajax動态内容加載。當我們綁定事件到Ajax load回來的内容上或其他動态建立的元素上時會發現事件沒響應,和你預想的結果不同,就像沒這會事兒一樣。這是前端開發 非常蛋疼的問題。jQuery在1.3的版本裡面引入了.live()方法,後來jQuery團隊有在這基礎上加入了.delegate()和.on()方法來解決這種尴尬的局面。大家可以根據你自己項目使用的jQuery版本不同選擇下面的不同方法解決這個問題。

舉個例子,假設我們有這樣一個頁面:

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script> $(document).ready(function(){
    $('button').click(function(){
      $('ol').append('<li><a href="#" target="_blank" rel="external nofollow" >動态增加的節點</a></li>');
    });
  }); </script> </head> <body> <ol> <li> <a href="#">靜态節點連接配接</a> </li> </ol> <button>增加節點</button> </body> </html>
           

我們要解決的問題就是當點增加節點按鈕時動态在ol下面添加一個節點并且給這個節點綁定alert事件。  

jQuery > 1.7.0 - 使用 .on() 事件綁定方法

如果你項目中使用的jQuery版本高于1.7.0,那麼推薦使用  .on() 方法,這個方法能夠直接綁定和代理事件。根據我們要實作的需求,我們需要使用代理事件來解決問題,也就是說我們吧事件的綁定交給父級元素,如何使用選擇器去實作事件綁定,來看一下代碼:

我們是首先把事件綁定到父級元素/或者說是容器,再通過類選擇器找到"a"元素,然後把事件傳遞到動态建立的子元素上。我們必須要把事件綁定放到父級,不然像下面這樣的代碼是不得行的:
           
如果是單個事件的綁定,那推薦使用這種事件綁定方法,這樣能夠很好的提升性能。
           
如果你不知道父類元素,你甚至可以綁定到 document 對象,不過這樣綁定像click這樣的簡單事件還行,換成是mousemove那可能對性能就有比較大的影響
           

更多關于 .on() 方法的介紹,請看官方說明http://api.jquery.com/on/

1.7 > jQuery >1.4.2  - 使用 .delegate() 事件綁定方法

.delegate()方法是 .on() 方法的前輩,在使用方法和性能方面都和.on() 方法類似,看代碼:
           
更多關于 .delegate() 方法的介紹,請看官方說明http://api.jquery.com/delegate/
           

1.4.2 > jQuery > 1.3 - 使用 .live() 事件綁定方法

.live()這個方法應該是屬于元老級的了,在jQuery 1.3的版本裡面首次出現,就是為了解決綁定事件到動态元素的問題,這個在jQuery 1.7的版本裡屬于是棄用的方法,jQuery 1.9以後就直接删除了。
           
需要注意的是這個方法是實作原理是把事件綁定到document對象,然後通過選擇器和目标事件比較,如果比對就觸發事件,前提條件要好保證事件的必須是連續正常執行的,如果其中一個事件出問題了,那所有的事件都不會觸發,另外,如果從document上取消事件綁定,那麼所有通過.live()方法綁定的事件都會取消。看代碼:
           
更多關于 .live() 方法的介紹,請看官方說明http://api.jquery.com/live/
           

1.3 > jQuery - 使用 .bind() 事件綁定方法

如果你的項目還在使用jQuery 1.3~以前的版本,那好最更新一下,實在沒法更新,那就按照下面兩個方法來解決這個問題。
           
1、自己實作事件的傳遞,類似上面的.live()方法
           

2、明确的對動态加載的内容做操作,比如加上相應的css,重新綁定事件

注:

不要把同一事件綁定到相同元素多次
           
盡量避免使用直接綁定到document對象,可以預先定義一個div,
比如<div id="ajax-loaded-container"></div>,
然後使用$('#ajax-loaded-container .my-link').click(...)這樣的方法去實作
           
需要動态綁定的css也可以在伺服器端的css檔案裡預先定義好
           

轉載于:https://my.oschina.net/u/2006682/blog/311789

繼續閱讀