JavaScript的事件機制詳解
事件是將JavaScript腳本與網(wǎng)頁聯(lián)系在一起的主要方式,是JavaScript中最重要的主題之一,深入理解事件的工作機制以及它們對性能的影響至關重要。本文將詳細探討JavaScript的事件機制,并對比分析了瀏覽器之間的不同,具體內容包括事件流、事件處理程序綁定方式、事件對象等。
如何理解事件?
JavaScript與HTML之間的交互就是通過事件實現(xiàn)的。
事件:用戶或瀏覽器自身執(zhí)行的某種動作,換言之,文檔或瀏覽器發(fā)生的一些特定的交互瞬間。
事件處理程序:又稱事件偵聽器,事件發(fā)生時執(zhí)行的代碼段。
事件流:事件流描述的是從頁面中接收事件的順序。
兩種基本事件模型
事件冒泡:事件按照從最特定的事件目標到最不特定的事件目標(document對象)的順序觸發(fā)。
事件捕獲:事件從最不精確的對象(document 對象)開始觸發(fā),然后到最精確。
IE9、Safari、Chrome、Opera、Firefox都是從window對象開始捕獲,冒泡到window對象

DOM事件流
同時支持 兩種基本事件模型,規(guī)定事件流包括三個階段:事件捕獲階段、處于目標階段、事件冒泡階段。
DOM事件處理程序綁定時,程序員可以自己選擇綁定事件時采用事件捕獲還是事件冒泡。
IE事件流
IE只支持事件冒泡,不支持事件捕獲。
事件處理程序綁定方式
DOM事件處理程序
DOM事件處理程序屬性名為“on”+事件名,程序作用域為元素的作用域,this指向元素本身。
方法一:將函數(shù)值賦給一個事件處理程序屬性。如下:
var btn= document.getElementById("myBtn");
btn.onclick = function{ //具體代碼段 }
注意:此種方法只能添加一個事件處理程序
方法二:通過addEventListener方法。如下:
addEventListener("事件名",事件處理程序,ture/false:在事件捕獲/冒泡階段調用模型)
對應的事件處理程序移除方法:removeEventListener,參數(shù)必須相同。
注意:此種方法,以匿名函數(shù)添加的事件處理程序無法被移除
此方法可以添加多個事件處理程序
IE事件處理程序
IE+Oprea瀏覽器
程序作用域為全局作用域,this指向window對象
添加方法:attachEvent("on+事件名",事件處理程序)
移除方法:detachEvent("on+事件名",事件處理程序)
事件對象
在觸發(fā)某個事件時,會產(chǎn)生一個相應的事件對象,這個對象包含所有與事件相關的信息。如:導致事件的元素、事件的類型等
DOM中的事件對象
對象名:event
常用屬性:
type:被觸發(fā)事件的類型
target:事件的目標
常用方法:
event.preventDefault:取消事件默認行為(前提:cancelable屬性值為true)
event.stopPropagation:取消事件的進一步冒泡或捕獲
IE中的事件對象
對象名:window.event
常用屬性:
type:被觸發(fā)事件的類型
scrElement:事件的目標
常用方法:
event.cancelBubble(true/false):true->取消事件默認行為
event.returnValue(true/false):false->取消事件的進一步冒泡或捕獲
綜合以上所述,整理代碼寫可跨瀏覽器的事件處理程序(構造EventUtil對象,為其添加可兼容各瀏覽器的事件處理方法),如下:
/*可跨瀏覽器的事件處理程序
構造EventUtil對象,為其添加可兼容各瀏覽器的事件處理方法
*/
var EventUtil = {
/*添加事件處理程序*/
addHandler: function (element, type, handler) {
if (element.addEventListener) {
addEventListener(type, handler, false);
} else if (element.attachEvent) {
attachEvent("on" + type, handler);
} else {
element["on" + type] = handler;
}
},
/*移除事件處理程序*/
removeHandler: function (element, type, handler) {
if (element.removeEventListener) {
removeEventListener(type, handler, false);
} else if (element.detachEvent) {
detachEvent("on" + type, handler);
} else {
element["on" + type] = null;
}
},
/*獲得事件對象*/
getEvent: function (event) {
return event ? event : window.event;
},
/*獲得事件的目標*/
getTarget: function (event) {
return event.target || event.scrElement;
},
/*取消事件的默認行為*/
preventDefault: function (event) {
if (event.preventDefault) {
event.preventDefault;
} else {
event.returValue = false;
}
},
/*阻止事件進一步冒泡*/
stopPropagation: function (event) {
if (event.stopPropagation) {
event.stopPropagation;
} else {
event.cancelBubble = true;
}
}
};
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關文章
JavaScript常用數(shù)組去重實戰(zhàn)源碼
本文給大家分享js常用8種數(shù)組去重實戰(zhàn)源碼,針對每種方法通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2021-07-07
JS基于onclick事件實現(xiàn)單個按鈕的編輯與保存功能示例
這篇文章主要介紹了JS基于onclick事件實現(xiàn)單個按鈕的編輯與保存功能,結合實例形式分析了JS實現(xiàn)onclick響應事件的轉換相關操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2017-02-02
javascript json對象小技巧之鍵名作為變量用法分析
這篇文章主要介紹了javascript json對象小技巧之鍵名作為變量用法,結合實例形式分析了json對象變量操作相關使用技巧,需要的朋友可以參考下2019-11-11
JavaScript實現(xiàn)郵箱地址自動匹配功能代碼
這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)E-mail郵箱地址自動匹配功能代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11

