給Jquery動态添加的元素綁定事件
我想很多人都會向我一樣曾經 被新元素的事件綁定困惑很久也就是
在頁面加載完成後給元素綁定了事件,但又新增加的元素上卻沒有綁定任何事件。
js的事件監聽跟css不一樣,css隻要設定好了樣式,不論是原來就有的還是新添加的,都有一樣的表現。而事件監聽不是,你必須給每一個元素單獨綁定事件。
常見的例子是處理表格的時候。每行行末有個删除按鈕,點了這個能夠删除這一行。
<table>
<tbody>
<tr>
<td>這行原來就有</td>
<td><buttonclass="del">删除</button></td>
</tr>
<tr>
<td>這行原來就有</td>
<td><buttonclass="del">删除</button></td>
</tr>
</tbody>
</table>
通常,我會這麼綁定
- jQuery(function($){
- //已有删除按鈕初始化綁定删除事件
- $(".del").click(function() {
- $(this).parents("tr").remove();
- });
-
});
對于在domready之前就存在的删除按鈕,一切都很完美。但如果在domready之後用js動态添加幾行,那新增的幾行中的這些按鈕都将失去任何作用。
如何解決這個問題?以下提供4種解決方案:
=============================
1号解決方案——onclick法
如果不顧結構與行為分離的準則的話,通常,我會這麼做。
注意,此時的deltr這個function必須是全局函數,得放jQuery(function($) {})外面,放裡邊就成局部函數了,html裡的onclick就調用不到了!
- <td><buttononclick="deltr(this)">删除</button></td>
- jQuery(function($){
- //添加行
- $("#add2").click(function(){
- $("#table2>tbody").append('<tr><td>新增行</td><td><button οnclick="deltr(this)">删除</button></td></tr>')
- });
- });
- //删除行的函數,必須要放domready函數外面
- function deltr(delbtn){
- $(delbtn).parents("tr").remove();
- };
2号解決方案——重複綁定法
即,在domready的時候就給已有的元素綁定事件處理函數,
而後當新增加的元素的時候再次綁定。
- <td><buttonclass="del">删除</button></td>
- jQuery(function($){
- //定義删除按鈕事件綁定
- //寫裡邊,防止污染全局命名空間
- function deltr(){
- $(this).parents("tr").remove();
- };
- //已有删除按鈕初始化綁定删除事件
- $("#table3 .del").click(deltr);
- //添加行
- $("#add3").click(function(){
- $('<tr><td>新增行</td><td><button class="del">删除</button></td></tr>')
- //在這裡給删除按鈕再次綁定事件。
- .find(".del").click(deltr).end()
- .appendTo($("#table3>tbody"));
- });
- });
3号解決方案——事件冒泡法
利用事件冒泡的原理,我們給這個按鈕的祖先元素綁定事件處理函數。
然後通過event.target這個對象來判斷,這個事件是不是我們要找的對象觸發的。
通常可以利用一些DOM屬性,比如event.target.className、event.target.tagName等之類的來判斷。
- <td><buttonclass="del">删除</button></td>
- jQuery(function($){
- //第四個表格的删除按鈕事件綁定
- $("#table4").click(function(e) {
- if (e.target.className=="del"){
- $(e.target).parents("tr").remove();
- };
- });
- //第四個表格的添加按鈕事件綁定
- $("#add4").click(function(){
- $("#table4>tbody").append('<tr><td>新增行</td><td><button class="del">删除</button></td></tr>')
- });
- });
另外,可以使用on進行綁定,如下: $(document).on('click','.name', function() { //處理代碼 });
修改動态添加元素的樣式或事件:由于ajax是異步的,如果你的方法和ajax在同一級,ajax還沒接到傳回結果,就已經執行了你那個方法了,是以你要把你的的方法放到ajax()的success裡面。也可以在ajax()的success裡把要擷取的元素設定為全局變量,用來在外部事件中調用。
- jQuery(function($){
- //已有删除按鈕初始化綁定删除事件
- $(".del").click(function() {
- $(this).parents("tr").remove();
- });
- });