javascript的事件監聽與捕獲和冒泡
在前端開發中,我們經常需要對某些事件進行監聽。這樣只要在指定的元素上觸發了該事件,就會執行一個回撥來進行相關的操作。
而js中事件監聽方法總共有三種,分別如下所示:
- element.addEventListener(type, listener[, useCapture]); // IE6~8不支援
- element.attachEvent(’on’ + type, listener); // IE6~10,IE11不支援
- element[’on’ + type] = function(){} // 所有瀏覽器
demo:
function cb() { console.log(1); } element.addEventListener('click', cb, false); element.attachEvent('onclick', cb); element.onclick = cb;
引數含義:
type
:事件型別
listener
:事件觸發後的回撥函式
useCapture
:是否使用捕獲,如果值為true, useCapture 表示使用者希望發起捕獲。 在發起捕獲之後, 只要Dom子樹下發生了該事件型別,都會先被該事件監聽器捕獲,然後再被派發到Dom子樹中的事件監聽器中。並且向上冒泡的事件不會觸發那些發起捕獲的事件監聽器。進一步的解釋可以檢視 DOM Level 3 Events 文件。 useCapture 預設值為false
。
addEventListener
是W3C工作組在DOM Level 2開始引入的一個註冊事件監聽器的方法;而在此之前,傳統的事件監聽方法是通過element[’on’ + type]
的方式來註冊的。它們兩之間的主要區別是,element[’on’ + type]
的方式無法使用事件捕獲,並且element[’on’ + type]
不支援對同一個元素的同一個事件註冊多個事件監聽器。如下面的例子所示,元素被點選後只會輸出1,而不會輸出0和1.
element.onclick = function(){ console.log(0); } element.onclick = function(){ console.log(1); }
然而addEventListener
方法在IE6~8的瀏覽器中不被支援。那麼在低版本的IE中怎麼來為同一個事件註冊多個事件監聽器呢?原來IE從IE5.0系列開始就引入了attachEvent()
方法來支援這一特性。但遺憾的是該方法也不支援事件捕獲。並且從IE 11開始,這個方法已經被棄用。
談談事件的捕獲和冒泡
W3C規範中定義了3個事件階段,依次是捕獲階段、目標階段、冒泡階段。事件物件按照上圖的傳播路徑依次完成這些階段。如果某個階段不支援或事件物件的傳播被終止,那麼該階段就會被跳過。舉個例子,如果Event.bubbles
屬性被設定為false
,那麼冒泡階段就會被跳過。如果Event.stopPropagation()
在事件派發前被呼叫,那麼所有的階段都會被跳過。
- 捕獲 階段:在事件物件到達事件目標之前,事件物件必須從window經過目標的祖先節點傳播到事件目標。 這個階段被我們稱之為捕獲階段。在這個階段註冊的事件監聽器在事件到達其目標前必須先處理事件。
- 目標 階段:事件物件到達其事件目標。 這個階段被我們稱為目標階段。一旦事件物件到達事件目標,該階段的事件監聽器就要對它進行處理。如果一個事件物件型別被標誌為不能冒泡。那麼對應的事件物件在到達此階段時就會終止傳播。
- 冒泡 階段: 事件物件以一個與捕獲階段相反的方向從事件目標傳播經過其祖先節點傳播到window。這個階段被稱之為冒泡階段。在此階段註冊的事件監聽器會對相應的冒泡事件進行處理。
在一個事件完成了所有階段的傳播路徑後,它的Event.currentTarget
會被設定為null
並且Event.eventPhase
會被設為0。Event
的所有其他屬性都不會改變(包括指向事件目標的Event.target
屬性)
<script src="http://htmljs.b0.upaiyun.com//js/tuiku.js"></script>
相關文章
- JavaScript事件捕獲冒泡與捕獲JavaScript事件
- Javascript中的事件冒泡與捕獲JavaScript事件
- javascript事件冒泡和事件捕獲型別JavaScript事件型別
- 事件冒泡 和 事件捕獲事件
- JavaScript事件冒泡、事件捕獲和阻止預設事件JavaScript事件
- JS事件(事件冒泡和事件捕獲)JS事件
- 理解js的事件冒泡和事件捕獲JS事件
- 關於js事件冒泡和事件捕獲JS事件
- JS中的事件順序(事件捕獲與冒泡)JS事件
- JavaScript高階程式設計筆記 事件冒泡和事件捕獲JavaScript程式設計筆記事件
- 事件的捕獲、冒泡、委託事件
- 關於瀏覽器裡事件的捕獲和冒泡及監聽器執行的順序瀏覽器事件
- Javascript事件模型系列(二)事件的捕獲-冒泡機制及事件委託機制JavaScript事件模型
- JavaScript 事件捕獲JavaScript事件
- 生動詳細解釋javascript的冒泡和捕獲JavaScript
- JavaScript 事件監聽JavaScript事件
- Spirit帶你徹底瞭解事件捕獲和冒泡機制事件
- JavaScript 事件冒泡JavaScript事件
- javascript監聽鍵盤事件JavaScript事件
- javascript事件捕獲是什麼意思JavaScript事件
- 關於鑑權流程的捕獲和冒泡子流程
- 事件和事件監聽器事件
- JavaScript阻止事件冒泡JavaScript事件
- 事件冒泡、事件捕獲、DOM0級事件處理程式、DOM2級事件處理程式事件
- JavaScript和JQuery的滑鼠mouse事件冒泡處理JavaScriptjQuery事件
- #每日一記#通過 GIF 理解 addEventListener、捕獲和冒泡dev
- javascript擼來擼去(1)-事件監聽與物件屬性JavaScript事件物件
- 事件監聽事件
- javascript阻止事件冒泡程式碼JavaScript事件
- Spring Boot 事件和監聽Spring Boot事件
- JavaScript阻止冒泡和取消事件預設行為JavaScript事件
- javascript基礎(事件的冒泡)(三十二)JavaScript事件
- js 監聽事件的疊加和移除JS事件
- Spring事件釋出與監聽Spring事件
- Nacos - 事件的註冊、取消與監聽(EventDispatcher)事件
- javascript事件冒泡簡單例項JavaScript事件單例
- Flutter事件監聽Flutter事件
- jQuery事件監聽jQuery事件