給Jquery動(dòng)態(tài)添加的元素添加事件

轉(zhuǎn)自

我想很多人都會(huì)向我一樣曾經(jīng) 被新元素的事件綁定困惑很久也就是在頁面加載完成后給元素綁定了事件,但又新增加的元素上卻沒有綁定任何事件。
js的事件監(jiān)聽跟css不一樣,css只要設(shè)定好了樣式,不論是原來就有的還是新添加的,都有一樣的表現(xiàn)。而事件監(jiān)聽不是,你必須給每一個(gè)元素單獨(dú)綁定事件。
常見的例子是處理表格的時(shí)候。每行行末有個(gè)刪除按鈕,點(diǎn)了這個(gè)能夠刪除這一行。

<table>  
<tbody>
<tr>
<td>這行原來就有</td>
<td><buttonclass="del">刪除</button></td>
</tr>
<tr> <td>這行原來就有</td>
     <td><buttonclass="del">刪除</button></td>
 </tr>   
</tbody>
</table>

通常,我會(huì)這么綁定

jQuery(function($){
   //已有刪除按鈕初始化綁定刪除事件
    $(".del").click(function() {
        $(this).parents("tr").remove();
   });
});

對(duì)于在domready之前就存在的刪除按鈕,一切都很完美。但如果在domready之后用js動(dòng)態(tài)添加幾行,那新增的幾行中的這些按鈕都將失去任何作用。
如何解決這個(gè)問題?以下提供4種解決方案:=============================0號(hào)解決方案——onclick法

如果不顧結(jié)構(gòu)與行為分離的準(zhǔn)則的話,通常,我會(huì)這么做。注意,此時(shí)的deltr這個(gè)function必須是全局函數(shù),得放jQuery(function($) {})外面,放里邊就成局部函數(shù)了,html里的onclick就調(diào)用不到了!
<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>')
});
});
//刪除行的函數(shù),必須要放domready函數(shù)外面
function deltr(delbtn){
$(delbtn).parents("tr").remove();
};

=============================1號(hào)解決方案——重復(fù)綁定法即,在domready的時(shí)候就給已有的元素綁定事件處理函數(shù),而后當(dāng)新增加的元素的時(shí)候再次綁定。
<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"));
});
});

=============================2號(hào)解決方案——事件冒泡法利用事件冒泡的原理,我們給這個(gè)按鈕的祖先元素綁定事件處理函數(shù)。然后通過event.target這個(gè)對(duì)象來判斷,這個(gè)事件是不是我們要找的對(duì)象觸發(fā)的。通常可以利用一些DOM屬性,比如event.target.className、event.target.tagName等之類的來判斷。
<td><buttonclass="del">刪除</button></td>

jQuery(function($){
//第四個(gè)表格的刪除按鈕事件綁定
$("#table4").click(function(e) {
if (e.target.className=="del"){
$(e.target).parents("tr").remove();
};
});
//第四個(gè)表格的添加按鈕事件綁定
$("#add4").click(function(){
$("#table4>tbody").append('<tr><td>新增行</td><td><button class="del">刪除</button></td></tr>')
});
});

另外,可以使用live進(jìn)行綁定,如下:
$('.clickme').live('click', function() {
//處理代碼
});

:一般采用0號(hào)解決方案

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式。設(shè)計(jì)者無需花費(fèi)時(shí)間糾纏JS復(fù)雜的高級(jí)特性。 1....
    LaBaby_閱讀 1,367評(píng)論 0 2
  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式。設(shè)計(jì)者無需花費(fèi)時(shí)間糾纏JS復(fù)雜的高級(jí)特性。 1....
    LaBaby_閱讀 1,200評(píng)論 0 1
  • (續(xù)jQuery基礎(chǔ)(1)) 第5章 DOM節(jié)點(diǎn)的復(fù)制與替換 (1)DOM拷貝clone() 克隆節(jié)點(diǎn)是DOM的常...
    凜0_0閱讀 1,363評(píng)論 0 8
  • 同一個(gè)地點(diǎn),一只蝸牛每天向前進(jìn)步0.01,一只蝸牛每天向后倒退0.01,試問一年后,它們相距多遠(yuǎn)? 你肯定會(huì)說,才...
    蘭花_9a59閱讀 484評(píng)論 1 1
  • 今天下午帶倆娃新安公園玩耍,子涵頗有領(lǐng)導(dǎo)氣質(zhì)的指揮比他還要大的小朋友,瞬間覺得我家大寶好帥!小娃在旁急切的看著他哥...
    翩翩870閱讀 179評(píng)論 0 0