學(xué)習(xí)JavaScript事件流和事件處理程序
本文全篇介紹了JavaScript事件流和事件處理程序,分享給大家供大家參考,具體內(nèi)容如下
一、事件流
事件流描述的是從頁(yè)面中接收事件的順序。IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕獲流。
二、事件冒泡
即事件開(kāi)始時(shí)由最具體的元素接收,然后逐級(jí)向上傳播到較為不具體的節(jié)點(diǎn)。如:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> <div>Click</div> </body> </html>
當(dāng)點(diǎn)擊了頁(yè)面中的div元素,那么這個(gè)click事件會(huì)按照如下順序傳播:
- div元素
- body元素
- html元素
- document對(duì)象
三、事件捕獲
事件捕獲的思想是最具體的節(jié)點(diǎn)應(yīng)該最后接收到事件。事件捕獲的用意在于事件到達(dá)目標(biāo)之前捕獲它。
當(dāng)點(diǎn)擊了頁(yè)面中的div元素,那么這個(gè)click事件則會(huì)按照如下順序傳播:
- document對(duì)象
- html標(biāo)簽
- body標(biāo)簽
- div標(biāo)簽
雖然規(guī)范要求事件應(yīng)該從document對(duì)象開(kāi)始傳播,但瀏覽器一般都是從window對(duì)象開(kāi)始捕獲事件的。因?yàn)槔习姹緸g覽器不支持,所以一般都使用事件冒泡。
四、DOM事件流
“DOM2級(jí)事件”規(guī)定的事件流包括三個(gè)階段:事件捕獲階段、處于目標(biāo)階段和事件冒泡階段。
在DOM事件流中,實(shí)際的目標(biāo)在捕獲階段不會(huì)接收事件。就是說(shuō)在捕獲階段,事件從document到html再到body后就停止了。下一個(gè)階段是“處于目標(biāo)”階段,于是事件在div中發(fā)生,并在事件處理中被看成是冒泡階段的一部分。然后,冒泡階段發(fā)生。IE8及更早的版本不支持DOM事件流,瀏覽器在捕獲階段觸發(fā)事件對(duì)象上的事件,結(jié)果就是有兩個(gè)機(jī)會(huì)在目標(biāo)對(duì)象上面操作事件。
五、事件處理程序
事件就是用戶或?yàn)g覽器自身執(zhí)行的某種動(dòng)作;事件處理程序(或事件偵聽(tīng)器)就是響應(yīng)某個(gè)事件的函數(shù)。事件處理程序的名字以“on”開(kāi)頭,如onload、onclick等。
六、HTML事件處理程序
若要在按鈕被單擊時(shí)執(zhí)行一些js代碼,可以這樣編寫:
<div onclick="alert('Clicked')">Click</div>
注意:不能在其中使用未經(jīng)轉(zhuǎn)義的HTML語(yǔ)法字符。
也可以調(diào)用在頁(yè)面中其他地方定義的腳本:
<script> function showMessage () { document.write("fdas"); } </script> <input type="button" value="Click Me" onclick="showMessage()" />
事件處理程序中的代碼在執(zhí)行時(shí),有權(quán)訪問(wèn)全局作用域中的任何代碼。
這樣使用會(huì)創(chuàng)建一個(gè)封裝著的元素屬性值的函數(shù)。這個(gè)函數(shù)有一個(gè)局部變量event,也就是事件對(duì)象:
<input type="button" value="Click Me" onclick="alert(event.type)" />
其中,this值等于事件的目標(biāo)元素,如:
<input type="button" value="Click Me" onclick="alert(this.value)" />
HTML事件處理程序存在眾多問(wèn)題,所以應(yīng)該使用js指定的事件處理程序
七、DOM0級(jí)事件處理程序
要使用js指定事件處理程序,首先必須取得一個(gè)要操作的對(duì)象的引用。
每個(gè)元素都有自己的事件處理程序?qū)傩?,這些屬性通常全部小寫,如onclick。如:
<input type="button" value="Click Me" id="btn" /> <script> document.querySelector("#btn").onclick = function() { console.log("hello"); } </script>
使用DOM0級(jí)方法指定的事件處理程序被認(rèn)為是元素的方法。因此,這時(shí)候的事件處理程序是在元素的作用域中運(yùn)行的;也就是this引用當(dāng)前元素:
<input type="button" value="Click Me" id="btn" /> <script> document.querySelector("#btn").onclick = function() { console.log(this.type); } </script>
以上述這種方式添加的事件處理程序會(huì)在事件流的冒泡階段被處理。
刪除通過(guò)DOM0級(jí)方法指定的事件處理程序:
btn.onclick = null;
八、DOM2級(jí)事件處理程序
addEventListener()
該方法接收三個(gè)參數(shù):要處理的事件名、事件處理程序函數(shù)和布爾值;布爾值如果是true,表示在捕獲階段調(diào)用事件處理程序;如果是false,表示在冒泡階段調(diào)用事件處理程序。如:
var btn = document.getElementById("btn"); btn.addEventListener("click", function () { console.log(this.id); })
還可以為該按鈕添加多個(gè)事件處理程序,如:
var btn = document.getElementById("btn"); btn.addEventListener("click", function () { console.log(this.id); }) btn.addEventListener("click", function () { console.log(this.value); })
removeEventListener()
var btn = document.getElementById("btn"); function info () { console.log(this.value); } btn.addEventListener("click", info); btn.addEventListener("click", function () { console.log(this.id); }); btn.addEventListener("click", function valueAndId () { console.log(this.value + " " + this.id); }); btn.removeEventListener("click", info); //有效 btn.removeEventListener("click", function () { console.log(this.id); }); //無(wú)效 btn.removeEventListener("click", valueAndId); //報(bào)錯(cuò)無(wú)效
大多數(shù)情況下,都是將事件處理程序添加到事件流的冒泡階段,這樣就可以最大限度地兼容各種瀏覽器。
以上就是關(guān)于JavaScript事件流和事件處理程序的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
相關(guān)文章
JS實(shí)現(xiàn)盒子跟著鼠標(biāo)移動(dòng)及鍵盤方向鍵控制盒子移動(dòng)效果示例
這篇文章主要介紹了JS實(shí)現(xiàn)盒子跟著鼠標(biāo)移動(dòng)及鍵盤方向鍵控制盒子移動(dòng)效果,涉及javascript事件響應(yīng)及頁(yè)面元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-01-01JS動(dòng)畫效果打開(kāi)、關(guān)閉層的實(shí)現(xiàn)方法
這篇文章主要介紹了JS動(dòng)畫效果打開(kāi)、關(guān)閉層的實(shí)現(xiàn)方法,可實(shí)現(xiàn)js控制層從中心位置打開(kāi)與關(guān)閉的功能,涉及javascript操作頁(yè)面元素的相關(guān)技巧,需要的朋友可以參考下2015-05-05JS技巧Canvas性能優(yōu)化臟矩形渲染實(shí)例詳解
這篇文章主要為大家介紹了JS技巧Canvas?性能優(yōu)化臟矩形渲染實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01uniapp與webview之間的相互傳值的實(shí)現(xiàn)
這篇文章主要介紹了uniapp與webview之間的相互傳值的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06JavaScript實(shí)現(xiàn)簡(jiǎn)單省市聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)單省市聯(lián)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10json字符串對(duì)象轉(zhuǎn)換代碼實(shí)例
這篇文章主要介紹了json字符串對(duì)象轉(zhuǎn)換代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09