JavaScript常見事件源與事件流的獲取方法及解析
事件源
在事件中,當(dāng)前操作的那個元素就是事件源。比如網(wǎng)頁元素中 input 有 onclick 事件,當(dāng)點(diǎn)擊 input 發(fā)送 onclic 事件時(shí),事件源就是 input。
常見事件源:
(鼠標(biāo)) 事件 | 描述 |
---|---|
onclick | 鼠標(biāo)單擊對象時(shí)觸發(fā) |
ondblclick | 鼠標(biāo)雙擊對象時(shí)觸發(fā) |
onmousedown | 鼠標(biāo)按鈕被按下時(shí)觸發(fā) |
onmousemove | 鼠標(biāo)被移動時(shí)觸發(fā) |
onmouseout | 鼠標(biāo)離開監(jiān)聽該事件的元素或子元素時(shí)觸發(fā) |
onmouseover | 鼠標(biāo)移動到監(jiān)聽該事件的元素或子元素時(shí)觸發(fā) |
onmouseup | 鼠標(biāo)松開時(shí)觸發(fā) |
(鍵盤) 事件 | 描述 |
---|---|
onkeydown | 鍵盤按下 |
keypress | 鍵盤按住 |
keyup | 鍵盤松開 |
(表單控件) 事件 | 描述 |
---|---|
onblur | 失去焦點(diǎn) |
onfocus | 獲取焦點(diǎn) |
oninput | 輸入 |
onchange | 改變 |
onsubmit | 提交 |
onreset | 重置 |
(頁面) 事件 | 描述 |
---|---|
onload | 頁面加載結(jié)束 |
onscroll | 滾動 |
onresize | 改變大小 |
獲取事件源
事件源是作為event對象的屬性存在的。在W3C規(guī)范中,這個屬性是 target ;但是 IE8.0 及其以下版本不支持該屬性,它使用 srcElement 屬性來獲取事件源。
<html> <head> <title>獲取事件源</title> </head> <body> <div id="demo">點(diǎn)擊這里</div> <script type="text/javascript"> document.getElementById("demo").onclick=function(e){ var eve = e || window.event; var srcNode = eve.target || eve.srcElement; // 兼容所有瀏覽器 alert(srcNode); } </script> </body> </html>
事件流:
描述的是從頁面中接收事件的順序,也可以理解為事件的傳播順序。
DOM事件流存在的三個階段:
- 事件捕獲階段
- 處于目標(biāo)階段
- 事件冒泡階段
事件捕獲(event capturing):當(dāng)鼠標(biāo)點(diǎn)擊或者觸發(fā)dom事件時(shí),瀏覽器會從根節(jié)點(diǎn)開始由外到內(nèi)進(jìn)行事件傳播,即點(diǎn)擊了子元素,如果父元素通過事件捕獲方式注冊了對應(yīng)的事件的話,會先觸發(fā)父元素綁定的事件。
事件冒泡(dubbed bubbling):與事件捕獲恰恰相反,事件冒泡順序是由內(nèi)到外進(jìn)行事件傳播,直到根節(jié)點(diǎn)。
DOM標(biāo)準(zhǔn)事件流的觸發(fā)的先后順序?yàn)椋合炔东@再冒泡,即當(dāng)觸發(fā)dom事件時(shí),會先進(jìn)行事件捕獲,捕獲到事件源之后通過事件傳播進(jìn)行事件冒泡。
不同的瀏覽器對此有著不同的實(shí)現(xiàn),IE10及以下不支持捕獲型事件,所以就少了一個事件捕獲階段,IE11、Chrome 、Firefox、Safari等瀏覽器則同時(shí)存在。
target 和 currentTarget
- target是觸發(fā)事件的某個具體的對象,只會出現(xiàn)在事件機(jī)制的目標(biāo)階段,即"誰觸發(fā)了事件,誰就是target"。
- currentTarget是綁定了當(dāng)前事件類型的對象,有可能是目標(biāo)節(jié)點(diǎn)的祖先節(jié)點(diǎn)。
阻止事件在冒泡階段傳播
event.stopPropagation
//阻止事件在冒泡階段傳播
<!-- 例子結(jié)構(gòu) --> <div id="outer"> <p id="inner"></p> </div>
/** * 點(diǎn)擊#inner之后會發(fā)生如下過程: * outer捕獲階段 * inner 一 * inner 二 * inner 三 */ const inner = document.querySelector('#inner'); const outer = document.querySelector('#outer'); inner.addEventListener("click", event => { console.log("inner 一"); }, false); inner.addEventListener("click", event => { console.log("inner 二"); event.stopPropagation(); }, false); inner.addEventListener("click",event => { console.log("inner 三"); }, false); outer.addEventListener("click", event => { console.log("outer捕獲階段"); }, false); outer.addEventListener("click", event => { console.log("outer冒泡階段"); }, false);
如果有多個相同類型事件的事件監(jiān)聽函數(shù)綁定到同一個元素,當(dāng)該類型的事件觸發(fā)時(shí),它們會按照被添加的順序執(zhí)行。如果其中某個監(jiān)聽函數(shù)執(zhí)行了event.stopImmediatePropagation()
方法,則當(dāng)前元素剩下的監(jiān)聽函數(shù)將不會被執(zhí)行,并且阻止事件在冒泡階段傳播。
/** * 點(diǎn)擊#inner之后會發(fā)生如下過程: * outer捕獲階段 * inner 一 * inner 二 */ const inner = document.querySelector('#inner'); const outer = document.querySelector('#outer'); inner.addEventListener("click", (event) => { console.log("inner 一"); }, false); inner.addEventListener("click", (event) => { console.log("inner 二"); event.stopImmediatePropagation(); }, false); inner.addEventListener("click",(event) => { console.log("inner 三"); }, false); outer.addEventListener("click", event => { console.log("outer捕獲階段"); }, false); outer.addEventListener("click", event => { console.log("outer冒泡階段"); }, false);
以上就是JavaScript常見事件源與事件流的獲取方法及解析的詳細(xì)內(nèi)容,更多關(guān)于JavaScript事件源事件流的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
實(shí)現(xiàn)圖片首尾平滑輪播(JS原生方法—節(jié)流)
下面小編就為大家?guī)硪黄獙?shí)現(xiàn)圖片首尾平滑輪播(JS原生方法—節(jié)流)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10基于JS實(shí)現(xiàn)bookstore靜態(tài)頁面的實(shí)例代碼
本文給大家分享一段核心代碼基于js實(shí)現(xiàn)的bookstore靜態(tài)頁面,代碼簡單易懂,非常不錯,具有參考借鑒價(jià)值,需要的朋友參考下2017-02-02javascript實(shí)現(xiàn)狀態(tài)欄文字首尾相接循環(huán)滾動的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)狀態(tài)欄文字首尾相接循環(huán)滾動的方法,實(shí)例分析了javascript定時(shí)函數(shù)及頁面元素屬性操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07微信小程序 確認(rèn)框的實(shí)現(xiàn)(附代碼)
這篇文章主要介紹了微信小程序 確認(rèn)框的實(shí)現(xiàn)(附代碼),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07