淺談JavaScript之事件綁定_javascript技巧
其實沒有什麼新的知識點,只是為了方便其他有需要的朋友們翻閱,對自己而言也算是一個積累,所以只能算是閒談 JavaScript,老鳥們可以盡情飄過。
在進入正題之前,先提個問題熱身吧。
現在有以下HTML 結構:
程式碼
以及如下JavaScript 代碼:
var wrap = document.getElementById('wrap'),
inputs = wrap.getElementsByTagName('input');
inputs[i].onclick = function () {
>
請問,這樣執行的結果是什麼?
/***************************分割線***************** **********/如果你的回答是“點擊按鈕時, alert 當前按鈕的索引值 i”,那你就中了我的圈套了。大家不妨試試,無論你點擊哪個按鈕,它都會alert(5)。
這個看似理所當然的結果為什麼會和實際情況不同呢?其實也是很好理解的。
因為onclick 只是事件綁定,而不是執行,當我們執行onclick 事件的時候,這時的i 已經是循環以後的值了,照這樣看,每個按鈕都alert(5) 也就不足為奇奇了。
那麼,如果我們要怎麼實現「點擊按鈕時,alert 當前按鈕的索引值 i」呢?這裡就要用到 JavaScript 中暗藏玄機的一個概念「閉包」。我們可以用閉包的方式改寫以上JS,把for 迴圈中的i 值存到記憶體中,
程式碼如下:
inputs = wrap.getElementsByTagName('in inputs = wrap.getElementsByTagName
for (var i = 0, l = inputs.length; i (function (cur) {
cur);
}
})(i)
}
再試效果?
以上的方法,我們是透過循環閉包給button 按鈕上綁定事件,我們知道,在JavaScript 中函數也是對象,對象就會佔用內存,現在的例子中只有5 個按鈕,或許你會認為這樣的效能開銷可以忽略不計,但是如果當我們有50個,甚至500 個按鈕的時候,IE 已經哭了,當有更多其他效能隱患並發時,所有的瀏覽器都哭了。 回到剛才的例子,我們可以用「事件委託」的方法來解決這個因綁定事件隨著按鈕增加而可能導致的效能問題。原理很簡單,利用Javascript 的事件冒泡,我們可以把事件的綁定從按鈕移到它們的父級元素上,不管按鈕有多少,它們只有一個共同的父級元素,這樣我們只需要綁定一次事件就可以了。
程式碼如下:
var wrap = document.getElementById('wrap'),
inputs = wrap.getElementsByTagName('input');
wrap.onclick = function (onclick)> var ev = ev || window.event,
target = ev.target || ev.srcElement;
for (var i = 0, l = inputs.length; i if (inputs[i] === target) {
alert(i)
}
一下,來些餐後甜點。
除了在效能上,事件委託比閉包的事件綁定更有優勢以外,事件委託還無需顧及子元素(即被綁定事件的元素)的數量。例如,我們在onclick 事件綁定以後,
增加一個按鈕:
複製程式碼
同樣在最後加了這段程式碼的閉包方式和事件委託方式,我們可以看到,閉包實現的事件綁定中點擊「按鈕六」毫無效果,但是在事件委託中實現的事件綁定點擊「按鈕六」則會有alert。相反,如果我們要刪除一個按鈕,閉包的方式仍會在內存中保存已刪除按鈕的onclick 事件(除非手動設為null),事件委託則不會對內存造成多餘的負擔,就為此原因,我們也應該多加利用事件委託的方式來綁定同一層級的多個元素。

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數
