JavaScript事件 "事件對象"的注意要點(diǎn)
在觸發(fā)DOM上的某個(gè)事件時(shí),會(huì)產(chǎn)生一個(gè)事件對象event。
DOM中的事件對象
兼容DOM的瀏覽器會(huì)將一個(gè)event對象傳入到事件處理程序中。event對象包含與創(chuàng)建它的特定事件有關(guān)的屬性和方法。除法的事件類型不一樣,可用的屬性方法就不一樣。不過,所有的事件都會(huì)有下表列出的成員。
下面列出了 2 級 DOM 事件標(biāo)準(zhǔn)定義的屬性:
- bubbles: 返回布爾值,指示事件是否是起泡事件類型。
- cancelable: 返回布爾值,指示事件是否可擁可取消的默認(rèn)動(dòng)作。
- currentTarget: 返回其事件監(jiān)聽器觸發(fā)該事件的元素。
- eventPhase: 返回事件傳播的當(dāng)前階段。
- target: 返回觸發(fā)此事件的元素(事件的目標(biāo)節(jié)點(diǎn))。
- timeStamp: 返回事件生成的日期和時(shí)間。
- type: 返回當(dāng)前 Event 對象表示的事件的名稱。
下面列出了 2 級 DOM 事件標(biāo)準(zhǔn)定義的方法。IE 的事件模型不支持這些方法:
- initEvent(): 初始化新創(chuàng)建的 Event 對象的屬性。
- preventDefault(): 通知瀏覽器不要執(zhí)行與事件關(guān)聯(lián)的默認(rèn)動(dòng)作。
- stopPropagation(): 不再派發(fā)事件。
this、target、currentTarget
在事件處理程序的內(nèi)部,對象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沒有注冊事件處理程序,所以該click事件就冒泡到了document.body
}
在這里,this和currentTarget都是document.body,因?yàn)槭录幚沓绦蚴亲缘竭@個(gè)元素上的。但是target元素卻等于按鈕元素,因?yàn)樗莄lick事件的真正目標(biāo)。由于按鈕并沒有注冊事件處理程序,結(jié)果click事件就冒泡到了document.body,在那里事件才能得到處理。
type
在需要通過一個(gè)函數(shù)處理多個(gè)事件時(shí),可以使用type屬性。如:
//獲取按鈕
var btn = document.querySelector("#btn");
//設(shè)置多個(gè)事件
var handler = function() {
//檢測事件的類型
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;
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)頁上全部的a標(biāo)簽超鏈接功能。要注意的是,只有cancelable屬性設(shè)置為true的事件,才可以使用preventDefault()來取消其默認(rèn)行為。
stopPropagation()
立即停止事件在DOM層次中的傳播,即取消進(jìn)一步的事件捕獲或冒泡。例如,直接添加到一個(gè)按鈕的事件處理程序可以調(diào)用該方法,從而避免觸發(fā)注冊在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
該屬性用來確定事件當(dāng)前正位于事件流的哪個(gè)階段。
1、如果是捕獲階段則等于1;
2、如果是目標(biāo)對象階段則等于2;
3、如果是冒泡階段則等于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)對象階段,實(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)對象階段 --> document.body 冒泡階段
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。
相關(guān)文章
JavaScript動(dòng)態(tài)改變HTML頁面元素例如添加或刪除
HTML頁面元素可以通過js動(dòng)態(tài)改變,比如可以向HTML中添加元素或刪除某個(gè)元素,下面為示例代碼,感興趣的朋友不要錯(cuò)過2014-08-08
jstree中的checkbox默認(rèn)選中和隱藏示例代碼
這篇文章主要介紹了jstree的checkbox默認(rèn)選中和隱藏,需要的朋友可以參考下2019-12-12
利用JavaScript實(shí)現(xiàn)ISO周日歷
周日歷是日常生活中不常用到的歷法系統(tǒng),一般用于政府、商務(wù)的會(huì)計(jì)年度或者學(xué)校教學(xué)日歷中。本文將利用JavaScript制作個(gè)簡單的周日歷,感興趣的可嘗試一下2022-07-07
詳解javascript appendChild()的完整功能
這篇文章主要介紹了詳解javascript appendChild()的完整功能,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
JavaScript面向?qū)ο罄^承原理與實(shí)現(xiàn)方法分析
這篇文章主要介紹了JavaScript面向?qū)ο罄^承原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析就面向?qū)ο蟪绦蛟O(shè)計(jì)中原形、對象、繼承的相關(guān)概念、原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下2018-08-08
使用canvas實(shí)現(xiàn)仿新浪微博頭像截取上傳功能
用戶提供圖像大小尺寸不合適,如何用截取上傳呢?接下來小編教大家使用使用canvas實(shí)現(xiàn)仿新浪微博頭像截取上傳功能解決問題,需要的朋友一起學(xué)習(xí)吧。2015-09-09
JS動(dòng)態(tài)添加選項(xiàng)案例分析
這篇文章主要介紹了JS動(dòng)態(tài)添加選項(xiàng)的方法,結(jié)合實(shí)例形式分析了javascript針對頁面元素動(dòng)態(tài)操作的相關(guān)技巧,需要的朋友可以參考下2016-10-10
基于layPage插件實(shí)現(xiàn)兩種分頁方式淺析
這篇文章主要為大家詳細(xì)介紹了基于layPage插件實(shí)現(xiàn)兩種分頁方式 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07

