摘要:級事件規定事件流包括三個階段事件捕獲目標事件事件冒泡。返回布爾值,指示事件是否可擁可取消的默認動作。返回其事件監聽器觸發該事件的元素。返回當前對象表示的事件的名稱。不再派發事件常用于阻止事件冒泡。
事件是 JavaScript 與 HTML 交互的基礎。要實現用戶與頁面的交互,先要對目標元素綁定特定的事件、設置事件處理函數,然后用戶觸發事件,事件處理函數執行,產生交互效果。DOM 事件級別
DOM 級別分為四個級別:DOM0 級、DOM1 級、DOM2 級、DOM3 級;
DOM 事件級別分為三個級別:
DOM0 級事件
缺點:無法設置多個事件處理函數
DOM2 級事件
可以為事件設置多個事件處理函數,可以通過第三個參數 ( useCapture ) 設置在什么階段執行事件處理函數,默認是 false, 即在事件冒泡階段執行事件處理函數。
需要注意的是在 IE8 及以下版本需要用 attachEvent 和 detachEvent 實現,只有兩個參數,事件名需要以 on 開頭,只支持在事件冒泡階段執行事件處理函數。
DOM3 級事件
DOM3 級事件是在 DOM2 級事件的基礎上添加了更多的事件類型,允許自定義事件。
UI事件,當用戶與頁面上的元素交互時觸發,如:load、scroll
焦點事件,當元素獲得或失去焦點時觸發,如:blur、focus
鼠標事件,當用戶通過鼠標在頁面執行操作時觸發如:dbclick、mouseup
滾輪事件,當使用鼠標滾輪或類似設備時觸發,如:mousewheel
文本事件,當在文檔中輸入文本時觸發,如:textInput
鍵盤事件,當用戶通過鍵盤在頁面上執行操作時觸發,如:keydown、keypress
合成事件,當為IME(輸入法編輯器)輸入字符時觸發,如:compositionstart
變動事件,當底層DOM結構發生變化時觸發,如:DOMsubtreeModified
// 自定義事件 var event = new Event("test") // 給元素綁定事件 domElement.addEventListener("test", function() { console.log("event test") },) // 觸發事件 setTimeout(function() { domElement.dispatchEvent(event) }, 1000)DOM 事件流
想象畫在一張紙上的一組同心圓。如果把手指放在圓心上,那么手指指向的不僅僅是一個圓,而是紙上的所有圓。所以如果點擊了某個按鈕,點擊事件不僅僅發生在這個按鈕上,整個頁面也被點擊了。
事件流又稱為事件傳播,描述的是從頁面中接收事件的順序。DOM2 級事件規定事件流包括三個階段: 事件捕獲(capturing phase)、目標事件(target phase)、事件冒泡(bubbling phase)。
發生的順序是:事件捕獲階段 --> 目標事件階段 --> 事件冒泡階段
事件開始時由最具體的元素(目標元素)接收,然后逐級向上傳播。
目標元素父級元素
運行結果:
事件按 window -> document -> html -> body -> ... -> 目標元素 的方向向下層元素傳遞。
目標元素父級元素
運行結果:
![bubbling](https://user-gold-cdn.xitu.io...
)
在用戶觸發事件,執行事件處理函數的時候,默認會向事件處理函數傳入一個 event 對象,它記錄了該事件的狀態和行為。event 常用屬性和方法
type 事件類型
target 事件發出者(觸發事件的元素)
currentTarget
事件監聽者(被綁定事件的元素)
stopPropagation() 阻止事件冒泡或捕獲
preventDefault() 阻止瀏覽器默認行為
target 、currentTarget 與 this當點擊 parent 時,輸出:
1...2...3...
當點擊 child 時,輸出:
1...2...3...
所以 target 是事件發出者,curentTarget 是事件監聽者,事件處理函數中的 this 等同于 e.currentTargetevent 對象的一些兼容性寫法
獲得 event
// 事件處理函數 function handleClick(event) { var e = event || window.event ··· }
獲得 target
··· var target = e.target || e.srcElement ···
阻止瀏覽器默認行為
··· e.preventDefault ? e.preventDefault() : (e.returnValue = false) ···
阻止冒泡
··· e.stopPropagation ? e.stopPropagation() : (e.cancelBubble = true) ···
事件綁定與解綁
function addEvent(element, type, fn) { element.addEventListener ? element.addEventListener(type, fn, false) : element.attachEvent("on"+ type, fn) } function removeEvent(element, type, fn) { element.removeEventListener ? element.removeEventListener(type, fn, false) : element.detachEvent("on"+ type, fn) }屬性表
基礎屬性
屬性 | 描述 |
---|---|
altKey | 返回當事件被觸發時,”ALT” 是否被按下。 |
button | 返回當事件被觸發時,哪個鼠標按鈕被點擊。 |
clientX | 返回當事件被觸發時,鼠標指針的水平坐標。 |
clientY | 返回當事件被觸發時,鼠標指針的垂直坐標。 |
ctrlKey | 返回當事件被觸發時,”CTRL” 鍵是否被按下。 |
metaKey | 返回當事件被觸發時,”meta” 鍵是否被按下。 |
relatedTarget | 返回與事件的目標節點相關的節點。 |
screenX | 返回當某個事件被觸發時,鼠標指針的水平坐標。 |
screenY | 返回當某個事件被觸發時,鼠標指針的垂直坐標。 |
shiftKey | 返回當事件被觸發時,”SHIFT” 鍵是否被按下。 |
IE 屬性
屬性 | 描述 |
---|---|
cancelBubble | 如果事件句柄想阻止事件傳播到包容對象,必須把該屬性設為 true。 |
fromElement | 對于 mouseover 和 mouseout 事件,fromElement 引用移出鼠標的元素。 |
keyCode | 對于 keypress 事件,該屬性聲明了被敲擊的鍵生成的 Unicode 字符碼。對于 keydown 和 keyup |
offsetX,offsetY | 發生事件的地點在事件源元素的坐標系統中的 x 坐標和 y 坐標。 |
returnValue | 如果設置了該屬性,它的值比事件句柄的返回值優先級高。把這個屬性設置為 false 可以阻止瀏覽器默認行為 |
srcElement | 對于生成事件的 Window 對象、Document 對象或 Element 對象的引用。 |
toElement | 對于 mouseover 和 mouseout 事件,該屬性引用移入鼠標的元素。 |
x,y | 事件發生的位置的 x 坐標和 y 坐標,它們相對于用CSS動態定位的最內層包容元素。 |
標準 event 屬性(2級 DOM 事件標準定義的屬性)
屬性或方法 | 描述 |
---|---|
bubbles | 返回布爾值,指示事件是否是冒泡事件類型。 |
cancelable | 返回布爾值,指示事件是否可擁可取消的默認動作。 |
currentTarget | 返回其事件監聽器觸發該事件的元素。 |
eventPhase | 返回事件傳播的當前階段。 |
target | 返回觸發此事件的元素(事件的目標節點)。 |
timeStamp | 返回事件生成的日期和時間。 |
type | 返回當前 Event 對象表示的事件的名稱。 |
initEvent() | 初始化新創建的 Event 對象的屬性。 |
preventDefault() | 通知瀏覽器不要執行與事件關聯的默認動作。 |
stopPropagation() | 不再派發事件(常用于阻止事件冒泡)。 |
閱讀原文
參考資料:
事件流理解
javascript event(事件對象)詳解
DOM 事件深入淺出(一)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/109074.html
摘要:布爾值表示捕獲階段調用事件處理程序,表示冒泡階段通過對象的方法,也可以定義事件的回調函數。對象會被作為第一個參數傳遞給事件監聽的回調函數。布爾默認值是,當設置成時用以取消事件的默認行為與中的相同。 其實這篇文章挺早之前就寫了,但是由于sf保存方面的bug,所以當時寫了一大堆,結果沒保存,覺得這個沒寫完是個不小的遺憾,今天正好有空,就給補充下了,也正好給我的javascript學習總結做...
摘要:響應某個事件的函數就叫事件處理程序或事件偵聽器。為事件指定事件處理程序的方法主要有種。事件處理程序事件直接加在元素上。事件委托利用冒泡的原理,把事件加到父元素或祖先元素上,觸發執行效果,解決事件處理程序過多問題。事件委托優點提高性能。 JavaScript簡單入門可以看看我丑丑的Github博客JavaScript簡單入門 事件 JavaScript與HTML之間的交互是通過事件實現的...
閱讀 1017·2023-04-25 22:27
閱讀 871·2021-11-22 14:56
閱讀 983·2021-11-11 16:54
閱讀 1677·2019-08-30 15:54
閱讀 3499·2019-08-30 13:20
閱讀 1212·2019-08-30 10:55
閱讀 2080·2019-08-26 13:34
閱讀 3280·2019-08-26 11:53