在觸發(fā)DOM上的某個(gè)事件時(shí)杰妓,會(huì)產(chǎn)生一個(gè)事件對象event鹅搪。這個(gè)對象中包含著所有與事件有關(guān)的信息禀苦。包括導(dǎo)致事件的元素蔓肯,事件的類型以及其他與特定事件相關(guān)的信息。
-
舉例
鼠標(biāo)操作導(dǎo)致的事件對象中振乏,會(huì)包含鼠標(biāo)位置的信息蔗包,
鍵盤操作導(dǎo)致的事件對象中,會(huì)包含按下的鍵有關(guān)的信息慧邮,
所有瀏覽器都支持event對象调限,event對象會(huì)傳入DOM0級舟陆,DOM2級,HTML指定的事件處理程序中耻矮,但支持的方式不同秦躯,所以也會(huì)涉及跨瀏覽器的部分。我們可以結(jié)合HTML DOM Event 對象來學(xué)習(xí)裆装。
我們知道踱承,特定的事件會(huì)有自己獨(dú)特的屬性,我們這里只看一些共有的屬性
1.標(biāo)準(zhǔn)瀏覽器
event:在支持至少DOM2級的瀏覽器內(nèi)哨免,無論使用html特性指定茎活,dom0級,2級琢唾,該對象都是該事件內(nèi)置對象载荔,可以在事件處理函數(shù)內(nèi)直接使用。
this:在支持至少DOM2級的瀏覽器內(nèi)采桃,無論使用html特性指定懒熙,dom0級,2級普办,都是指向當(dāng)前正在處理事件的那個(gè)元素工扎。
列舉所有事件的事件對象,都會(huì)有的成員泌豆。
列舉所有事件的事件對象定庵,共同擁有的成員。
屬性方法 | 類型 | 讀寫 | 描述 |
---|---|---|---|
bubbles | Blooean | 只讀 | 表明事件是否是起泡事件類型 |
cancelable | Blooean | 只讀 | 表明是否可以取消事件的默認(rèn)行為 |
currentTarget | Element | 只讀 | 其事件處理程序當(dāng)前正在處理事件的那個(gè)元素 |
target | Element | 只讀 | 事件的目標(biāo) |
eventPhase | Integar | 只讀 | 調(diào)用事件處理程序的階段:1表示捕獲階段2表示處于目標(biāo)3表示冒泡階段 |
trusted | Blooean | 只讀 | 為true表示事件是瀏覽器生成的踪危,為false表示事件是由開發(fā)人員通過js創(chuàng)建的 |
type | String | 只讀 | 被觸發(fā)的事件的類型 |
stopPropagation() | Function | 只讀 | 取消事件的進(jìn)一步捕獲或冒泡蔬浙,如果bubbels為true,則可以使用這個(gè)方法 |
preventDefault() | Function | 只讀 | 取消事件的默認(rèn)行為,如果cancelable為true,則可以使用這個(gè)方法 |
initEvent() | Event | 只讀 | 初始化新創(chuàng)建的 Event 對象的屬性 |
currentTarget:始終等于this對象裆蒸,隨著事件冒泡或者捕獲曙聂,他的值等于捕獲或冒泡到的上級元素。
target :觸發(fā)此事件的元素。
type
可以利用type屬性為一個(gè)元素同時(shí)添加多類事件處理程序。
采用dom0級測試
var btn=document.getElementById('myBtn');
var handler=function(){
switch(event.type){
case "click":
alert("clicked");
break;
case "mouseover":
event.target.style.background='red';
break;
case "mouseout":
event.target.style.background='yellow';
break;
}
};
btn.onclick=handler;
btn.onmouseover=handler;
btn.onmouseout=handler;
-
eventPahse
用來確定事件當(dāng)前位于事件流的哪個(gè)階段
var btn=document.getElementById('Mybtn');//body內(nèi)的div
var wrap=document.getElementById('wrap');//body
function handler(){
alert(event.eventPhase)
};
//單擊btn
btn.addEventListener('click',handler,false);//2處于目標(biāo)對象
wrap.addEventListener('click',handler,false);//3冒泡階段
wrap.addEventListener('click',handler,true);//1捕獲
-
cancelable、preventDefault()
只有cancelable為true時(shí)亮隙,才可以使用preventDefault()方法,來取消其默認(rèn)行為垢夹。
ie低版本通過:event.returnValue=false來實(shí)現(xiàn)
<a id="myherf">百度</a>
var Link=document.getElementById("myherf");
Link.onclick=function(){
event.preventDefault();
}
這樣單擊百度時(shí)溢吻,并不會(huì)跳轉(zhuǎn)到百度的頁面。
-
stopPropagation()
立即停止事件在dom層次中的傳播,即取消進(jìn)一步的事件捕獲或冒泡促王。
ie通過event.cancelBubble=true;阻止傳播
function handler(){
alert(event.type);
event.stopPropagation();
};
event對象只有在事件處理程序執(zhí)行期間犀盟,才會(huì)存在,執(zhí)行完畢即銷毀蝇狼。
2.IE中的事件對象
在IE8及其以前版本的瀏覽器是不兼容DOM2級的阅畴,但是還是可以使用dom0級的方法和自帶的方法添加事件處理程序。
event:
var div=document.getElementById("test");
div.onclick=function(){
var event=window.event; //event為window對象
alert(event.type);
}
event 對象必須作為 window 對象的一個(gè)屬性迅耘。event對象作為事件處理程序的內(nèi)部對象贱枣。可以直接使用event.type颤专。
html指定:event對象同樣也包含于創(chuàng)建他的事件相關(guān)的屬性和方法冯事。
this:
html指定
html標(biāo)簽上直接使用this,那么等于正在處理事件的那個(gè)元素血公。如果是使用標(biāo)簽上指定函數(shù),那么函數(shù)內(nèi)的this指的是window缓熟。
dom0級方法中
this等于正在處理事件的那個(gè)元素累魔。
使用IE的專屬 attachEvent()
this等于window
- IE的event包含的對象與方法
屬性方法 | 類型 | 讀寫 | 說明 |
---|---|---|---|
cancelBubble | Blooean | 讀/寫 | 默認(rèn)值為false,但將其設(shè)置為true就可以取消事件冒泡够滑,與DOM中stopPropagation()的方法作用相同 |
returnvalue | Blooean | 讀/寫 | 默認(rèn)值為true垦写,但將其設(shè)置為fasle,就可以取消事件的默認(rèn)行為彰触,與DOM中的preventDefault()方法的作用相同 |
srcElement | Element | 只讀 | 事件的目標(biāo)梯投,與DOM中的target屬性相同 |
- returnvalue
var div=document.getElementById("test");
div.onclick=function(){
window.event.returnValue=false;
}
但是沒有辦法判定默認(rèn)事件能否被取消。
- cancelBubble
var div=document.getElementById("test");
div.onclick=function(){
alert('ok')
window.event.cancelBubble=true;
}
因?yàn)镮E8及以前只支持冒泡所以只能取消冒泡况毅。
既然事件對象存在瀏覽器兼容問題分蓖,那么封裝一個(gè)跨瀏覽器的事件對象就很有必要!
跨瀏覽器的事件對象我在前面的JavaScript事件——事件冒泡尔许,事件捕獲么鹤,事件綁定與解綁,事件委托的文章末尾已經(jīng)給出過了味廊。
謝謝觀看U籼稹!余佛!