js的事件監聽跟css不一樣,css只要設定好了樣式,不論是原來就有的還是新加入的,都有一樣的表現。而事件監聽不是,你必須給每個元素單獨綁定事件。
常見的例子是處理表格的時候。每行行末有個刪除按鈕,點了這個能夠刪除這一行。
這行原來就有 | |
這行原來就有 |
通常,我會這麼綁定
jQuery(function($){
//已有刪除按鈕初始化綁定刪除事件
$(".del").click(function () {
$(this).parents("tr").remove();
});
});
對於在domready之前就存在的刪除按鈕,一切都很完美。但如果在domready之後用js動態加入幾行,那麼新增的幾行中的這些按鈕都會失去任何作用。
如何解決這個問題?以下提供4種解決方案:
0號解答-onclick法
如果不顧結構與行為分離的準則的話,通常,我會這麼做。
注意,此時的deltr這個function必須是全域函數,得放jQuery(function($) {})外面,放裡邊就成局部函數了,html裡的onclick就呼叫不到了!
jQuery(function($){
//新增行
$("#add2").click(function(){
$("#table2>tbody").append('
});
});
//刪除行的函數,必須要放domready函數外面
function deltr(delbtn){
$(delbtn). parents("tr").remove();
};
1號解決方案-重複綁定法
即,在domready的時候就給予已有的元素綁定事件處理函數,
而後當新增加的元素的時候再次綁定。
jQuery(function($){
//定義刪除按鈕事件綁定
//寫裡邊,防止污染全域命名空間
function deltr( ){
$(this).parents("tr").remove();
};
//已有刪除按鈕初始化綁定刪除事件
$("#table3 .del ").click(deltr);
//新增行
$("#add3").click(function(){
$('
//在這裡給刪除按鈕再次綁定事件。 del").click(deltr).end()
.appendTo($("#table3>tbody"));
});
});
2號解法-事件冒泡法
利用事件冒泡的原理,我們給這個按鈕的祖先元素綁定事件處理函數。
然後透過event.target這個物件來判斷,這個事件是不是我們要找的物件觸發的。
通常可以利用一些DOM屬性,像是event.target.className、event.target.tagName等之類的來判斷。
jQuery(function($){
//第四個表格的刪除按鈕事件綁定
$("#table4").click(function(e) {
if (e.target.className=="del"){
$(e.target).parents( "tr").remove();
};
});
//第四個表格的新增按鈕事件綁定
$("#add4").click(function( ){
$("#table4>tbody").append('
});
});
3號解法-複製事件法
上面幾種方案可以說即便你沒有用到jQuery函式庫,你也能相對比較容易的實作。但這種方案相對依賴jQuery的程度較高。而且必須要求jQuery 1.2版以上。低版本jQuery需要外掛。
上面兩個方案都是對刪除函數動了很多腦筋,換了多種觸發、綁定的方式。這個方案不同,可以與平時純靜態的元素一樣在domready的時候綁定。但在我們新增一行的時候我們改動一下,不再想上面那樣拼接字串來加入新行了。這回我們嘗試使用複製DOM元素的方式。並且複製的時候連同綁定的事件一起複製,複製完之後再用find之類的修改內部的元素。
同時,就像這個例子,如果你會把所有元素都刪除光,那template這個模板是必須的,如果不會刪光,那就未必需要用template了。為了防止被誤刪,此處我把template設了隱藏。
我使用了jQuery中特有的clone(true)
程式碼如下:
.template{display:none;}
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類,新增加的可以修改裡邊的數值。
這樣一個完美的結構與行為分離的案例就完成了。
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結構
這裡是模板
刪除
這行原來就有
這行原來有
ul>

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver CS6
視覺化網頁開發工具