jQuery on()綁定動態(tài)元素出現(xiàn)的問題小結
jQuery on()方法是官方推薦的綁定事件的一個方法。使用 on() 方法可以給將來動態(tài)創(chuàng)建的動態(tài)元素綁定指定的事件,例如append等。
之前使用 on 的時候一直是
$("").on('click','function(){ }')
之后發(fā)現(xiàn)有些時候一直無法綁定(比如元素動態(tài)生成時),查看文檔后發(fā)現(xiàn)正確用法應該是
$(document).on("change","#pageSize_out",function(){ if($("#page_out").val()!=0){ $("#pageSize").val($(this).val()); list(); } })
同時,注意
As this answers receives a lot of attention, here are two supplementary advises :
1) When it's possible, try to bind the event listener to the most precise element, to avoid useless event handling.
That is, if you're adding an element of class b to an existing element of id a, then don't use $(document.body).on('click', '#a .b', function(){ but use $('#a').on('click', '.b', function(){
2) Be careful, when you add an element with an id, to ensure you're not adding it twice. Not only is it "illegal" in HTML to have two elements with the same id but it breaks a lot of things. For example a selector "#c" would retrieve only one element with this id.
on(events,[selector],[data],fn)
events:一個或多個用空格分隔的事件類型和可選的命名空間,如"click"或"keydown.myPlugin" 。
selector:一個選擇器字符串用于過濾器的觸發(fā)事件的選擇器元素的后代。如果選擇器為null或省略,當它到達選定的元素,事件總是觸發(fā)。
data:當一個事件被觸發(fā)時要傳遞event.data給事件處理函數(shù)。
fn:該事件被觸發(fā)時執(zhí)行的函數(shù)。 false 值也可以做一個函數(shù)的簡寫,返回false。
替換bind()
當?shù)诙€參數(shù)'selector'為null時,on()和bind()其實在用法上基本上沒有任何區(qū)別了,所以我們可以認為on()只是比bind()多了一個可選的'selector'參數(shù),所以on()可以非常方便的換掉bind()
替換live()
在1.4之前相信大家非常喜歡使用live(),因為它可以把事件綁定到當前以及以后添加的元素上面,當然在1.4之后delegate()也可以做類似的事情了。live()的原理很簡單,它是通過document進行事件委派的,因此我們也可以使用on()通過將事件綁定到document來達到live()一樣的效果。
live()寫法
代碼如下:
$('#list li').live('click', '#list li', function() { //function code here. });
on()寫法
代碼如下:
$(document).on('click', '#list li', function() { //function code here. });
這里的關鍵就是第二個參數(shù)'selector'在起作用了。它是一個過濾器的作用,只有被選中元素的后代元素才會觸發(fā)事件。
替換delegate()
delegate()是1.4引入的,目的是通過祖先元素來代理委派后代元素的事件綁定問題,某種程度上和live()優(yōu)點相似。只不過live()是通過document元素委派,而delegate則可以是任意的祖先節(jié)點。使用on()實現(xiàn)代理的寫法和delegate()基本一致。
delegate()的寫法
代碼如下:
$('#list').delegate('li', 'click', function() { //function code here. });
on()寫法
代碼如下:
$('#list').on('click', 'li', function() { //function code here. });
貌似第一個和第二個參數(shù)的順序顛倒了一下,別的基本一樣。
總結
jQuery推出on()的目的有2個,一是為了統(tǒng)一接口,二是為了提高性能,所以從現(xiàn)在開始用on()替換bind(), live(), delegate吧。尤其是不要再用live()了,因為它已經處于不推薦使用列表了,隨時會被干掉。如果只綁定一次事件,那接著用one()吧,這個沒有變化。
jquery on() 方法綁定動態(tài)元素
廢話不多說了,直接給大家貼代碼了。
<div id="test"> <div class="evt">evt1</div> </div>
錯誤的用法,下面方法只為第一個class 為 evt 的div 綁定了click事件,使用append動態(tài)創(chuàng)建的div則沒有綁定
<script> // 先綁定事件再添加div $('#test .evt').on('click', function() {alert($(this).text())}); $('#test').append('<div class="evt">evt2</div>'); </script>
正確的用法如下:
<script> $('body').on('click', '#test .evt', function() {alert($(this).text())}); $('#test').append('<div class="evt">evt2</div>'); </script>
- jquery快捷動態(tài)綁定鍵盤事件的操作函數(shù)代碼
- jQuery on()方法綁定動態(tài)元素的點擊事件無響應的解決辦法
- jQuery on()方法綁定動態(tài)元素的點擊事件實例代碼淺析
- jQuery頁面元素動態(tài)添加后綁定事件丟失方法,非 live
- jquery html動態(tài)添加的元素綁定事件詳解
- jQuery支持動態(tài)參數(shù)將函數(shù)綁定到事件上的方法
- jQuery給動態(tài)添加的元素綁定事件的方法
- jquery彈窗插件colorbox綁定動態(tài)生成元素的方法
- jQuery 綁定事件到動態(tài)創(chuàng)建的元素上的方法實例
- jQuery動態(tài)添加的元素綁定事件處理函數(shù)代碼
- 淺談jQuery中事情的動態(tài)綁定
相關文章
jquery+CSS實現(xiàn)的水平布局多級網頁菜單效果
這篇文章主要介紹了jquery+CSS實現(xiàn)的水平布局多級網頁菜單效果,涉及jquery頁面元素屬性動態(tài)變換效果實現(xiàn)技巧,非常具有實用價值,需要的朋友可以參考下2015-08-08jQuery Validate表單驗證插件實現(xiàn)代碼
這篇文章主要介紹了jQuery Validate表單驗證插件實現(xiàn)代碼,需要的朋友可以參考下2017-06-06jQuery+ajax實現(xiàn)無刷新級聯(lián)菜單示例
這篇文章主要介紹了jQuery+ajax實現(xiàn)無刷新級聯(lián)菜單示例,代碼很完整,也非常實用,有需要的小伙伴可以參考下。2015-05-0513 款最熱門的 jQuery 圖像 360 度旋轉插件推薦
這篇文章主要介紹了13 款最熱門的 jQuery 圖像 360 度旋轉插件,非常炫酷實用,有需要的小伙伴參考下2014-12-12