理解JavaScript事件對(duì)象
在觸發(fā)DOM上的某個(gè)事件時(shí),會(huì)產(chǎn)生一個(gè)事件對(duì)象event。
DOM中的事件對(duì)象
兼容DOM的瀏覽器會(huì)將一個(gè)event對(duì)象傳入到事件處理程序中。event對(duì)象包含與創(chuàng)建它的特定事件有關(guān)的屬性和方法。除法的事件類型不一樣,可用的屬性方法就不一樣。不過(guò),所有的事件都會(huì)有下表列出的成員。
下面列出了 2 級(jí) DOM 事件標(biāo)準(zhǔn)定義的屬性:
- bubbles: 返回布爾值,指示事件是否是起泡事件類型。
- cancelable: 返回布爾值,指示事件是否可擁可取消的默認(rèn)動(dòng)作。
- currentTarget: 返回其事件監(jiān)聽(tīng)器觸發(fā)該事件的元素。
- eventPhase: 返回事件傳播的當(dāng)前階段。
- target: 返回觸發(fā)此事件的元素(事件的目標(biāo)節(jié)點(diǎn))。
- timeStamp: 返回事件生成的日期和時(shí)間。
- type: 返回當(dāng)前 Event 對(duì)象表示的事件的名稱。
下面列出了 2 級(jí) DOM 事件標(biāo)準(zhǔn)定義的方法。IE 的事件模型不支持這些方法:
- initEvent(): 初始化新創(chuàng)建的 Event 對(duì)象的屬性。
- preventDefault(): 通知瀏覽器不要執(zhí)行與事件關(guān)聯(lián)的默認(rèn)動(dòng)作。
- stopPropagation(): 不再派發(fā)事件。
this、target、currentTarget
在事件處理程序的內(nèi)部,對(duì)象this始終等于currentTarget的值,而target則只包含事件的實(shí)際目標(biāo)。如果直接將事件處理程序指定給了目標(biāo)元素,則this、currentTarget和target包含相同的值。如:
var btn = document.querySelector("#btn"); btn.onclick=function () { console.log(event.currentTarget === this); //true console.log(event.target === this); //true }
由于click事件的目標(biāo)是btn按鈕,所以這三個(gè)值是相等的。如果事件處理程序在按鈕的父節(jié)點(diǎn)(document.body)中,那么這些值則不相同。如:
var btn = document.querySelector("#btn"); document.body.onclick=function () { console.log(event.currentTarget === document.body); //true console.log(this === document.body); //true console.log(event.target === btn); //true 因?yàn)閎tn沒(méi)有注冊(cè)事件處理程序,所以該click事件就冒泡到了document.body }
在這里,this和currentTarget都是document.body,因?yàn)槭录幚沓绦蚴亲?cè)到這個(gè)元素上的。但是target元素卻等于按鈕元素,因?yàn)樗莄lick事件的真正目標(biāo)。由于按鈕并沒(méi)有注冊(cè)事件處理程序,結(jié)果click事件就冒泡到了document.body,在那里事件才能得到處理。
1、type
在需要通過(guò)一個(gè)函數(shù)處理多個(gè)事件時(shí),可以使用type屬性。如:
//獲取按鈕 var btn = document.querySelector("#btn"); //設(shè)置多個(gè)事件 var handler = function() { //檢測(cè)事件的類型 switch (event.type) { case "click": console.log("i click it"); break; case "mouseover": console.log("i enter it"); break; case "mouseout": console.log("i leave it"); break; } } //給響應(yīng)的事件賦值 btn.onclick = handler; btn.onmouseover = handler; btn.onmouseout = handler;
2、preventDefault()
要阻止特定事件的默認(rèn)行為,可以使用該方法。如:
var aTags = document.getElementsByTagName("a"); for (var i = 0; i < aTags.length; i++) { var currentATag = aTags[i]; currentATag.onclick = function() { event.preventDefault(); } };
以上代碼即屏蔽了網(wǎng)頁(yè)上全部的a標(biāo)簽超鏈接功能。要注意的是,只有cancelable屬性設(shè)置為true的事件,才可以使用preventDefault()來(lái)取消其默認(rèn)行為。
3、stopPropagation()
立即停止事件在DOM層次中的傳播,即取消進(jìn)一步的事件捕獲或冒泡。例如,直接添加到一個(gè)按鈕的事件處理程序可以調(diào)用該方法,從而避免觸發(fā)注冊(cè)在document.body上面的事件處理程序。如:
var btn = document.getElementById("btn"); btn.onclick = function () { console.log("btn clicked"); // event.stopPropagation(); }; window.onclick = function () { console.log("clicked"); }; //單擊一下的結(jié)果: //btn clicked //clicked
又如:
var btn = document.getElementById("btn"); btn.onclick = function () { console.log("btn clicked"); event.stopPropagation(); }; window.onclick = function () { console.log("clicked"); }; //單擊一下的結(jié)果: //btn clicked
eventPhase
該屬性用來(lái)確定事件當(dāng)前正位于事件流的哪個(gè)階段。
- 如果是捕獲階段則等于1;
- 如果是目標(biāo)對(duì)象階段則等于2;
- 如果是冒泡階段則等于3;
如:
var btn = document.getElementById("btn"); document.body.addEventListener("click", function() { console.log("bodyListener" + event.eventPhase); }, true) //捕獲階段 btn.onclick = function() { console.log("btn" + event.eventPhase); } //目標(biāo)對(duì)象階段,實(shí)際上屬于冒泡階段(在btn上) document.body.onclick = function() { console.log("body" + event.eventPhase); } //冒泡階段(在body上)
又如:
var btn = document.getElementById("btn"); document.body.addEventListener("click", function() { console.log(event.eventPhase); //1 console.log(event.currentTarget); //HTMLBodyElement }, true); btn.addEventListener("click", function() { console.log(event.eventPhase); //2 console.log(event.currentTarget); //HTMLInputElement }); document.body.addEventListener("click", function() { console.log(event.eventPhase); //3 console.log(event.currentTarget); //HTMLBodyElement });
流程大概是:
document.body 捕獲階段 --> btn 目標(biāo)對(duì)象階段 --> document.body 冒泡階段
以上就是關(guān)于JavaScript事件對(duì)象,希望對(duì)大家的學(xué)習(xí)有所幫助。
- js中獲取事件對(duì)象的方法小結(jié)
- javascript 事件對(duì)象 坐標(biāo)事件說(shuō)明
- JS的Event事件對(duì)象使用方法
- Js獲取事件對(duì)象代碼
- js中的觸發(fā)事件對(duì)象event.srcElement與event.target詳解
- JavaScript 事件流、事件處理程序及事件對(duì)象總結(jié)
- JavaScript學(xué)習(xí)筆記之JS事件對(duì)象
- JavaScript事件 "事件對(duì)象"的注意要點(diǎn)
- 淺談Javascript事件對(duì)象
- JavaScript事件對(duì)象深入詳解
相關(guān)文章
解決eclipse中沒(méi)有js代碼提示的問(wèn)題
今天小編就為大家分享一篇解決eclipse中沒(méi)有js代碼提示的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10從對(duì)象列表中獲取一個(gè)對(duì)象的方法,依據(jù)關(guān)鍵字和值
下面小編就為大家?guī)?lái)一篇從對(duì)象列表中獲取一個(gè)對(duì)象的方法,依據(jù)關(guān)鍵字和值。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09JS動(dòng)態(tài)給對(duì)象添加事件的簡(jiǎn)單方法
下面小編就為大家?guī)?lái)一篇JS動(dòng)態(tài)給對(duì)象添加事件的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07JavaScript實(shí)現(xiàn)簡(jiǎn)單生成隨機(jī)顏色的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)單生成隨機(jī)顏色的方法,涉及javascript隨機(jī)數(shù)與字符串運(yùn)算及頁(yè)面元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-09-09uniapp插件uview下表單無(wú)法動(dòng)態(tài)校驗(yàn)的問(wèn)題解決
最近項(xiàng)目中用到了uview?在做表單時(shí)用到了校驗(yàn),發(fā)現(xiàn)校驗(yàn)不友好的結(jié)果,下面這篇文章主要給大家介紹了關(guān)于uniapp插件uview下表單無(wú)法動(dòng)態(tài)校驗(yàn)的問(wèn)題解決,需要的朋友可以參考下2022-12-12微信小程序?qū)崿F(xiàn)用table顯示數(shù)據(jù)庫(kù)反饋的多條數(shù)據(jù)功能示例
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)用table顯示數(shù)據(jù)庫(kù)反饋的多條數(shù)據(jù)功能,涉及微信小程序wx.request訪問(wèn)php后臺(tái)及返回結(jié)果的顯示布局相關(guān)操作技巧,需要的朋友可以參考下2019-05-05JavaScript常用驗(yàn)證函數(shù)實(shí)例匯總
這篇文章主要介紹了JavaScript常用驗(yàn)證函數(shù),實(shí)例匯總了如字符串驗(yàn)證、表單驗(yàn)證及js常用特效等諸多js常用驗(yàn)證函數(shù)及相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11