JavaScript 事件繫結
在文章開頭先提一下React的事件繫結,React 裡只需把事件處理器(event handler)以駱峰命名(camelCased)形式當作元件的 props 傳入即可,就像使用普通 HTML 那樣。React 內部建立一套合成事件系統來使所有事件在 IE8 和以上瀏覽器表現一致。也就是說,React 知道如何冒泡和捕獲事件,而且你的事件處理器接收到的 events 引數與 W3C 規範 一致,無論你使用哪種瀏覽器。
如果需要在手機或平板等觸控裝置上使用 React,需要呼叫 React.initializeTouchEvents(true); 啟用觸控事件處理。
在後續的一篇文章中,我將詳細說明一下關於React事件的繫結及最大化公用事件。
自動繫結和事件代理
實際上,React 做了一些操作來讓程式碼高效執行且易於理解。
(1).Autobinding: 在 JavaScript 裡建立回撥的時候,為了保證 this 的正確性,一般都需要顯式地繫結方法到它的例項上。有了 React,所有方法被自動繫結到了它的元件例項上。React 還快取這些繫結方法,所以 CPU 和記憶體都是非常高效。而且還能減少打字!
(2).事件代理 : React 實際並沒有把事件處理器繫結到節點本身。當 React 啟動的時候,它在最外層使用唯一一個事件監聽器處理所有事件。當元件被載入和解除安裝時,只是在內部對映裡新增或刪除事件處理器。當事件觸發,React 根據對映來決定如何分發。當對映裡處理器時,會當作空操作處理。參考 David Walsh 很棒的文章 瞭解這樣做高效的原因。
在JavaScript中,事件委託是一種很常用也很合理的方法。事件委託可以讓你避免新增事件監聽器監聽特定的節點,相反,事件委託是將事件緊監聽放在父級節點上。該事件監聽冒泡事件,找到子元素進行匹配。下面舉個例子來說明一下事件委託的工作原理:
首先,我們有一些子元素的你UL元素:
[HTML] 純文字檢視 複製程式碼<ul id="parent-list"> <li id="post-1">Item 1</li> <li id="post-2">Item 2</li> <li id="post-3">Item 3</li> <li id="post-4">Item 4</li> <li id="post-5">Item 5</li> <li id="post-6">Item 6</li> </ul>
我們也說,有什麼需要點選每個子元素時發生。你可以將單獨的事件偵聽器新增到每個LI元素,但如果LI元素被頻繁的從列表中新增和刪除呢?新增和刪除事件偵聽器將是一場噩夢,尤其是如果新增和移除程式碼在Li的應用程式中不同的地方。更好的解決方案是一個事件監聽器新增到父UL元素。但是,如果你新增事件監聽到父UL,你將如何知道被點選哪些元素?
[JavaScript] 純文字檢視 複製程式碼// Get the element, add a click listener... document.getElementById("parent-list").addEventListener("click", function(e) { // e.target is the clicked element! // If it was a list item if(e.target && e.target.nodeName == "LI") { // List item found! Output the ID! console.log("List item ", e.target.id.replace("post-", ""), " was clicked!"); } });
通過增加一個click事件偵聽父元素開始。當事件聽者被觸發,檢查事件元件,以確保它的元素反應以型別。如果它是一個LI元素,但是,如果這不是我們想要的元素,該事件可以被忽略。這個例子是非常簡單 - UL和LI是一個直接的比較。讓我們嘗試一些更加困難。讓我們多子元素的父級DIV ,但我們關心的是與ClassA的CSS類的標記
[JavaScript] 純文字檢視 複製程式碼// Get the parent DIV, add click listener... document.getElementById("myDiv").addEventListener("click",function(e) { // e.target was the clicked element if (e.target && e.target.matches("a.classA")) { console.log("Anchor element clicked!"); } });
使用Element.matches API ,我們可以看到,如果匹配元素我們所期望的目標。
相關文章
- 事件繫結事件
- JavaScript學習筆記10: 事件繫結&監聽JavaScript筆記事件
- JSX繫結事件JS事件
- js on繫結事件JS事件
- 繫結自定義事件事件
- v-on 繫結事件事件
- JS-事件繫結JS事件
- Vue事件繫結原理Vue事件
- Hooks與事件繫結Hook事件
- [JavaScript] 事件委託以及 Vue 列表迴圈事件繫結的效能最佳化JavaScript事件Vue
- React事件優雅繫結React事件
- 元件繫結原生事件元件事件
- IOS繫結touchend事件失效iOS事件
- React事件繫結的方式React事件
- python tkinter如何繫結事件?Python事件
- JS的事件繫結和事件流模型JS事件模型
- zepto繫結事件改變冒泡事件流事件
- JS學習之事件和事件繫結JS事件
- JavaScript this 繫結規則JavaScript
- jQuery事件中on實現繫結多個事件jQuery事件
- 微信小程式事件繫結微信小程式事件
- 080 元件自定義事件-繫結元件事件
- Swoole 使用on()繫結事件報錯事件
- Vue事件獲取觸發事件物件和繫結事件物件Vue事件物件
- JS給全域性繫結事件以及給除某個元素外的其他元素繫結事件JS事件
- jQuery之_事件繫結與解綁jQuery事件
- echarts 繫結事件處理函式Echarts事件函式
- JavaScript keydown事件總結JavaScript事件
- JavaScript中this的繫結規則JavaScript
- javascript設計模式(張容銘)學習筆記 – 外觀模式繫結事件JavaScript設計模式筆記事件
- 模板語法之--強制資料繫結和繫結事件監聽事件
- React事件繫結幾種方法測試React事件
- 1.22 JQuery5:繫結自定義事件jQuery事件
- Vue 如何給元件繫結原生事件Vue元件事件
- three.js事件繫結外掛--onEventJS事件
- 關於JavaScript中this的軟繫結JavaScript
- JavaScript 的 this 指向和繫結詳解JavaScript
- 【測試平臺開發】Vue指令、屬性繫結、事件繫結學習教程Vue事件