學習JavaScript事件流和事件處理程序
本文全篇介紹了JavaScript事件流和事件處理程序,分享給大家供大家參考,具體內(nèi)容如下
一、事件流
事件流描述的是從頁面中接收事件的順序。IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕獲流。
二、事件冒泡
即事件開始時由最具體的元素接收,然后逐級向上傳播到較為不具體的節(jié)點。如:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> <div>Click</div> </body> </html>
當點擊了頁面中的div元素,那么這個click事件會按照如下順序傳播:
- div元素
- body元素
- html元素
- document對象
三、事件捕獲
事件捕獲的思想是最具體的節(jié)點應該最后接收到事件。事件捕獲的用意在于事件到達目標之前捕獲它。
當點擊了頁面中的div元素,那么這個click事件則會按照如下順序傳播:
- document對象
- html標簽
- body標簽
- div標簽
雖然規(guī)范要求事件應該從document對象開始傳播,但瀏覽器一般都是從window對象開始捕獲事件的。因為老版本瀏覽器不支持,所以一般都使用事件冒泡。
四、DOM事件流
“DOM2級事件”規(guī)定的事件流包括三個階段:事件捕獲階段、處于目標階段和事件冒泡階段。
在DOM事件流中,實際的目標在捕獲階段不會接收事件。就是說在捕獲階段,事件從document到html再到body后就停止了。下一個階段是“處于目標”階段,于是事件在div中發(fā)生,并在事件處理中被看成是冒泡階段的一部分。然后,冒泡階段發(fā)生。IE8及更早的版本不支持DOM事件流,瀏覽器在捕獲階段觸發(fā)事件對象上的事件,結果就是有兩個機會在目標對象上面操作事件。
五、事件處理程序
事件就是用戶或瀏覽器自身執(zhí)行的某種動作;事件處理程序(或事件偵聽器)就是響應某個事件的函數(shù)。事件處理程序的名字以“on”開頭,如onload、onclick等。
六、HTML事件處理程序
若要在按鈕被單擊時執(zhí)行一些js代碼,可以這樣編寫:
<div onclick="alert('Clicked')">Click</div>
注意:不能在其中使用未經(jīng)轉義的HTML語法字符。
也可以調(diào)用在頁面中其他地方定義的腳本:
<script>
function showMessage () {
document.write("fdas");
}
</script>
<input type="button" value="Click Me" onclick="showMessage()" />
事件處理程序中的代碼在執(zhí)行時,有權訪問全局作用域中的任何代碼。
這樣使用會創(chuàng)建一個封裝著的元素屬性值的函數(shù)。這個函數(shù)有一個局部變量event,也就是事件對象:
<input type="button" value="Click Me" onclick="alert(event.type)" />
其中,this值等于事件的目標元素,如:
<input type="button" value="Click Me" onclick="alert(this.value)" />
HTML事件處理程序存在眾多問題,所以應該使用js指定的事件處理程序
七、DOM0級事件處理程序
要使用js指定事件處理程序,首先必須取得一個要操作的對象的引用。
每個元素都有自己的事件處理程序屬性,這些屬性通常全部小寫,如onclick。如:
<input type="button" value="Click Me" id="btn" />
<script>
document.querySelector("#btn").onclick = function() {
console.log("hello");
}
</script>
使用DOM0級方法指定的事件處理程序被認為是元素的方法。因此,這時候的事件處理程序是在元素的作用域中運行的;也就是this引用當前元素:
<input type="button" value="Click Me" id="btn" />
<script>
document.querySelector("#btn").onclick = function() {
console.log(this.type);
}
</script>
以上述這種方式添加的事件處理程序會在事件流的冒泡階段被處理。
刪除通過DOM0級方法指定的事件處理程序:
btn.onclick = null;
八、DOM2級事件處理程序
addEventListener()
該方法接收三個參數(shù):要處理的事件名、事件處理程序函數(shù)和布爾值;布爾值如果是true,表示在捕獲階段調(diào)用事件處理程序;如果是false,表示在冒泡階段調(diào)用事件處理程序。如:
var btn = document.getElementById("btn");
btn.addEventListener("click", function () {
console.log(this.id);
})
還可以為該按鈕添加多個事件處理程序,如:
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);
}); //無效
btn.removeEventListener("click", valueAndId); //報錯無效
大多數(shù)情況下,都是將事件處理程序添加到事件流的冒泡階段,這樣就可以最大限度地兼容各種瀏覽器。
以上就是關于JavaScript事件流和事件處理程序的全部內(nèi)容,希望對大家的學習有所幫助。
相關文章
JavaScript實現(xiàn)Java中StringBuffer的方法
這篇文章主要介紹了JavaScript實現(xiàn)Java中StringBuffer的方法,實例分析了StringBuffer類的實現(xiàn)與使用技巧,需要的朋友可以參考下2015-02-02
JavaScript?顯示一個倒計時廣告牌的實現(xiàn)示例
本文主要介紹了JavaScript?顯示一個倒計時廣告牌的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
詳解原生JavaScript實現(xiàn)jQuery中AJAX處理的方法
這篇文章主要介紹了原生JavaScript實現(xiàn)jQuery中AJAX處理的方法,作者根據(jù)jQuery中一些對AJAX請求的處理方式來用原生API實現(xiàn),需要的朋友可以參考下2016-05-05

