亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

jquery 新建的元素事件綁定問題解決方案

2019-11-20 14:29:31
字體:
來源:轉載
供稿:網友

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種解決方案:

0號解決方案――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();
};

1號解決方案――重復綁定法

即,在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"));
});
});

2號解決方案――事件冒泡法

利用事件冒泡的原理,我們給這個按鈕的祖先元素綁定事件處理函數。
然后通過event.target這個對象來判斷,這個事件是不是我們要找的對象觸發的。
通??梢岳靡恍〥OM屬性,比如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>')
});
});


3號解決方案――復制事件法

上面幾種方案可以說即便你沒有用到jQuery庫,你也能相對比較容易的實現。但這種方案相對依賴jQuery的程度更高。而且必須要求jQuery 1.2版以上。低版本jQuery需要插件。
上面兩個方案都是對刪除函數動了很多腦筋,換了多種觸發、綁定的方式。這個方案不同,可以與平時純靜態的元素一樣在domready的時候綁定。但在我們添加新行的時候我們改動一下,不再想上面那樣拼接字符串來添加新行了。這回我們嘗試使用復制DOM元素的方式。并且復制的時候連同綁定的事件一起復制,復制完之后再用find之類的修改內部的元素。
同時,就像這個例子,如果你會把所有元素都刪除光,那template這個模板是必須的,如果不會刪光,那就未必需要用template了。為了防止被誤刪,此處我把template設了隱藏。
我使用了jQuery中特有的clone(true)
復制代碼 代碼如下:

.template{display:none;}

<trclass="template">
<td>這里是模板</td>
<td><button class="del">刪除</button></td>
</tr>
<tr>
<td>這行原來就有</td>
<td><button class="del">刪除</button></td>
</tr>
<tr>
<td>這行原來就有</td>
<td><button class="del">刪除</button></td>
</tr>

jQuery(function($){
//第五個表格的刪除按鈕事件綁定
$("#table5 .del").click(function() {
$(this).parents("tr").remove();
});
//第五個表格的添加按鈕事件綁定
$("#add5").click(function(){
$("#table5>tbody>tr:eq(0)")
//連同事件一起復制
.clone(true)
//去除模板標記
.removeClass("template")
//修改內部元素
.find("td:eq(0)")
.text("新增行")
.end()
//插入表格
.appendTo($("#table5>tbody"))
});
});

總評:

上面4種方案,各有優劣。
0號方案,結構與行為完全沒有分離,而且污染全局命名空間。最不推薦。所以我都不把它當作一個方案來看。但對于js初學者,可以用來項目救急。
1號方案,中規中矩,沒啥好也沒啥不好
2號方案,這種方法充分的發揮了js事件冒泡的優勢。而且效率最高。但同時由于這種方案無視了jQuery強大的選擇器,所以如果涉及的元素屬性要求過多就會比較麻煩了。你會徘徊在眾多if的條件的是非關系之中。后來我想起來,可以用jQuery中的$(event.target).is(selector)來作為條件。這樣可以極大提升開發效率,但略微降低執行效率。
3號方案,這是我認為最能體現結構與行為分離的思想的一種方案。但缺點也很明顯,對于jQuery依賴性過于高了,要不就自己寫一個復制連同事件一起復制的函數,但這也顯然對于初學者來說異常困難。但從未來的趨勢的角度來看,還是很推薦使用這種方案的。

具體選用哪一個方案,沒有定數。具體看你的項目以及你js還有結構與行為分離的思想的掌握程度。最適合的才是最好的。

附加:

把3號方案改造成完美的結構行為分離的樣式。
首先,帶有template的是模板元素。他是一切復制的源泉,為了防止被誤刪,所以設為不可見。如果不會刪除光,那么這個模板元素也是可選的。因為你可以復制任何一個已經存在的用于循環元素。
其次,給每個重復的元素加上一個repeat,方便用于刪除按鈕找到這一級元素。這個是可選的,有時候并不需要。
最后是給每一個要修改的元素加上一個類,便于用find找到。比如我這里就家了content類,新增加的可以修改里邊的值。
這樣一個完美的結構與行為分離的案例就完成了。
復制代碼 代碼如下:

<tableid="table6">
<tbody id="tbody6">
<tr class="template repeat">
<td class="content">這里是模板</td>
<td><button class="del">刪除</button></td>
</tr>
<tr class="repeat">
<td class="content">這行原來就有</td>
<td><button class="del">刪除</button></td>
</tr>
<tr class="repeat">
<td class="content">這行原來就有</td>
<td><button class="del">刪除</button></td>
</tr>
</tbody>
<tfoot>
<tr>
<td> </td>
<td><button id="add6">添加</button></td>
</tr>
</tfoot>
</table>

jQuery(function($){
//第六個表格的刪除按鈕事件綁定
$("#tbody6 .del").click(function() {
$(this).parents(".repeat").remove();
});
//第六個表格的添加按鈕事件綁定
$("#add6").click(function(){
$("#tbody6>.template")
//連同事件一起復制
.clone(true)
//去除模板標記
.removeClass("template")
//修改內部元素
.find(".content")
.text("新增行")
.end()
//插入表格
.appendTo($("#tbody6"))
});
});

同樣,這段js也適用于如下的html結構
復制代碼 代碼如下:

<ulid="tbody6">
<li class="template repeat">
<span class="content">這里是模板</span>
<span><button class="del">刪除</button></span>
</li>
<li class="repeat">
<span class="content">這行原來就有</span>
<span><button class="del">刪除</button></span>
</li>
<li class="repeat">
<span class="content">這行原來就有</span>
<span><button class="del">刪除</button></span>
</li>
</ul>

<script type="text/javascript"></script>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美另类极品videosbestfree| 精品香蕉一区二区三区| 亚洲国产精品yw在线观看| 91精品国产91久久久久久不卡| 成人在线免费观看视视频| 在线精品高清中文字幕| 91产国在线观看动作片喷水| 欧美xxxx18性欧美| 91在线色戒在线| 久99九色视频在线观看| 欧美成人sm免费视频| 91日韩在线视频| 国产成人精品一区二区三区| 日韩在线观看免费全集电视剧网站| 精品国产一区二区三区久久狼5月| 亚洲欧洲第一视频| 亚洲精选在线观看| 国产精品久久久久久久久久久不卡| 欧美成在线视频| 色妞欧美日韩在线| 欧美久久久精品| 国产精品亚洲网站| 久久人人爽人人爽人人片亚洲| 国内精品久久久久影院 日本资源| 亚洲欧美日韩中文视频| 播播国产欧美激情| 成人精品久久一区二区三区| 97超级碰在线看视频免费在线看| 色狠狠av一区二区三区香蕉蜜桃| 91po在线观看91精品国产性色| 热久久这里只有| 久久精品在线视频| 国产亚洲人成网站在线观看| 日本sm极度另类视频| 国产精品一二三视频| 久久精品国产亚洲精品2020| 欧美裸体xxxx极品少妇| 欧美日韩亚洲国产一区| 日本精品免费观看| 中文字幕日韩在线观看| 欧美视频在线免费看| 中文字幕日韩在线视频| 日韩av毛片网| 色狠狠av一区二区三区香蕉蜜桃| 日韩黄色在线免费观看| 欧美午夜久久久| 国产成人欧美在线观看| 91成人精品网站| 久久久久久久一区二区| 日韩电视剧免费观看网站| 精品国产福利视频| 亚洲精品mp4| 欧美日韩国产二区| 欧美激情视频一区二区三区不卡| 欧美性猛交xxxx黑人猛交| 91色琪琪电影亚洲精品久久| 91精品国产综合久久香蕉| 欧美激情综合色综合啪啪五月| 欧美国产在线电影| 午夜精品在线观看| 两个人的视频www国产精品| 性日韩欧美在线视频| 精品久久久久久久中文字幕| 国产精品一区二区电影| 亚洲国产精品免费| yw.139尤物在线精品视频| 午夜精品99久久免费| 成人网中文字幕| 亚洲欧美国产日韩天堂区| 97婷婷涩涩精品一区| 亚洲精品国产精品乱码不99按摩| 欧美男插女视频| 国产精品视频免费在线| 98精品国产自产在线观看| 国产精品视频区1| 国产精品久久久久7777婷婷| 日日摸夜夜添一区| 欧美日韩美女在线观看| 亚洲福利影片在线| 日本精品视频在线播放| 国产在线观看一区二区三区| 精品偷拍各种wc美女嘘嘘| 日本三级韩国三级久久| 亚洲aa在线观看| 欧美裸体男粗大视频在线观看| 国产精品第8页| 久久精品中文字幕一区| 久久久精品视频成人| 久久国产精品99国产精| 亚洲人成啪啪网站| 久久久国产成人精品| 国产丝袜一区视频在线观看| 亚洲欧美日韩第一区| 国产亚洲视频在线| 日韩精品在线视频美女| 亚洲国产精品va在线看黑人| 欧美日韩免费在线| 亚洲片在线观看| 日韩欧美在线视频观看| 成人免费看片视频| 亚洲成人激情在线观看| 成人a在线视频| 日韩欧美一区二区三区久久| 成人国内精品久久久久一区| 91精品国产免费久久久久久| 国产精品视频色| 欧美视频在线视频| 国产精品中文字幕在线| 国产自产女人91一区在线观看| 精品中文字幕乱| 久久久久久亚洲精品不卡| 精品福利在线视频| 国产视频丨精品|在线观看| 国产精品一区二区久久久久| 亚洲综合在线小说| 黄色一区二区三区| 亚洲国产中文字幕在线观看| 成人激情视频在线观看| 久久理论片午夜琪琪电影网| 日韩欧美亚洲国产一区| 国产精品久久久久福利| 欧美激情亚洲综合一区| 亚洲欧美制服另类日韩| 国产精品白丝av嫩草影院| 精品高清一区二区三区| 色偷偷91综合久久噜噜| 韩日欧美一区二区| 高清欧美一区二区三区| 亚洲成人精品视频在线观看| 97视频在线看| 国产精品美女久久久久av超清| 欧美精品国产精品日韩精品| 亚洲天堂第一页| 亚洲最大福利视频| 色偷偷噜噜噜亚洲男人| 欧美洲成人男女午夜视频| 欧美日韩在线视频观看| 97超碰国产精品女人人人爽| www.日本久久久久com.| 奇米四色中文综合久久| 伊是香蕉大人久久| 一二美女精品欧洲| 国产精品久久精品| 中国人与牲禽动交精品| 91亚洲永久免费精品| 亚洲iv一区二区三区| 成人www视频在线观看| 欧美激情精品久久久久| xx视频.9999.com| 欧美日韩中文字幕| 欧美寡妇偷汉性猛交| 国产精品成久久久久三级| 欧美国产日韩一区二区三区| 性欧美视频videos6一9| 久久久久久久久久久91| 国产三级精品网站| 久久香蕉国产线看观看av| 日本精品久久久| 亚洲精品少妇网址| 97免费视频在线| 亚洲精品视频播放| 中文精品99久久国产香蕉| 国语自产精品视频在免费| 国产男女猛烈无遮挡91|