JavaScript:事件對(duì)象

在觸發(fā) DOM 上的某個(gè)事件時(shí),會(huì)產(chǎn)生一個(gè)事件對(duì)象 event,這個(gè)對(duì)象中包含著所有與事件有關(guān)的信息。包括導(dǎo)致事件的元素、事件的類(lèi)型以及其他與特定事件相關(guān)的信息。
??所有瀏覽器都支持 event 對(duì)象,但支持方式不同。

DOM中的事件對(duì)象

兼容 DOM 的瀏覽器會(huì)將一個(gè) event 對(duì)象傳入到事件處理程序中。無(wú)論指定事件處理程序時(shí)使用什么方法(DOM0 級(jí)或 DOM2 級(jí)),都會(huì)傳入 event 對(duì)象。

  var btn = document.getElementById("myBtn");
  btn.onclick = function(event){
      alert(event.type);    //"click"
  };

  btn.addEventListener("click", function(event){
      alert(event.type);    //"click"
  }, false);

在通過(guò) HTML 特性指定事件處理程序時(shí),變量 event 中保存著 event 對(duì)象。

  <input type="button" value="Click Me" onclick="alert(event.type)"/>

event 對(duì)象包含與創(chuàng)建它的特定事件有關(guān)的屬性和方法。觸發(fā)的事件類(lèi)型不一樣,可用的屬性和方法也不一樣。不過(guò),所有事件都會(huì)有下表列出的成員。

屬性/方法 類(lèi) 型 讀/寫(xiě) 說(shuō)明
bubbles Boolean 只讀 表明事件是否冒泡
cancelable Boolean 只讀 表明是否可以取消事件的默認(rèn)行為
currentTarget Element 只讀 其事件處理程序當(dāng)前正在處理事件的那個(gè)元素
defaultPrevented Boolean 只讀 為 true表示已經(jīng)調(diào)用了preventDefault()(DOM3級(jí)事件中新增)
detail Integer 只讀 與事件相關(guān)的細(xì)節(jié)信息
eventPhase Integer 只讀 調(diào)用事件處理程序的階段:1表示捕獲階段,2表示“處于目標(biāo)”,3表示冒泡階段
preventDefault() Function 只讀 取消事件的默認(rèn)行為。如果 cancelable 是true,則可以使用這個(gè)方法
stopImmediatePropagation() Function 只讀 取消事件的進(jìn)一步捕獲或冒泡,同時(shí)阻止任何事件處理程序被調(diào)用(DOM3級(jí)事件中新增)
stopPropagation() Function 只讀 取消事件的進(jìn)一步捕獲或冒泡。如果 bubbles為 true,則可以使用這個(gè)方法
target Element 只讀 事件的目標(biāo)
trusted Boolean 只讀 為true表示事件是瀏覽器生成的。為 false 表示事件是由開(kāi)發(fā)人員通過(guò)JavaScript創(chuàng)建的(DOM3級(jí)事件中新增)
type String 只讀 被觸發(fā)的事件的類(lèi)型
view AbstractView 只讀 與事件關(guān)聯(lián)的抽象視圖。等同于發(fā)生事件的window 對(duì)象

在事件處理程序內(nèi)部,對(duì)象 this 始終等于 currentTarget 的值,而 target 則只包含事件的實(shí)際目標(biāo)。如果直接將事件處理程序指定給了目標(biāo)元素,則 this,currentTarget 和 target 包含相同的值。

  var btn = document.getElementById("myBtn");
  btn.onclick = function(event){
      alert(event.currentTarget === this);  //true
      alert(event.target === this);            //true
  }; 

如果事件處理程序存在于按鈕的父節(jié)點(diǎn)中(例如 document.body),那么這些值是不相同的。

document.body.onclick = function(event){
    alert(event.currentTarget === document.body);   //true
    alert(this === document.body);               //true
    alert(event.target === document.getElementById("myBtn")); //如果點(diǎn)擊“myBtn”,結(jié)果為true;如果點(diǎn)擊body,結(jié)果為false
}; 

注:只有在事件處理程序執(zhí)行期間, event 對(duì)象才會(huì)存在;一旦事件處理程序執(zhí)行完成, event 對(duì)象就會(huì)被銷(xiāo)毀。

IE中的事件對(duì)象

與訪(fǎng)問(wèn) DOM 中的 event 對(duì)象不同,要訪(fǎng)問(wèn) IE 中的 event 對(duì)象有幾種不同的方式,取決于指定事件處理程序的方法。

  • 在使用** DOM0 級(jí)方法**添加事件處理程序時(shí), event 對(duì)象作為 window 對(duì)象的一個(gè)屬性存在。
  var btn = document.getElementById("myBtn");
  btn.onclick = function(){
      var event = window.event;
      alert(event.type);     //"click"
  };
  • 在使用DOM2級(jí)方法添加事件處理程序時(shí), event 對(duì)象作為參數(shù)被傳入事件處理程序函數(shù)中。
  var btn = document.getElementById("myBtn");
  btn.attachEvent("onclick", function(event){
      alert(event.type);         //"click"
  });
  • 在HTML特性指定的事件處理程序中,通過(guò) event 變量來(lái)訪(fǎng)問(wèn) event對(duì)象(與 DOM中的事件模型相同)。
  <input type="button" value="Click Me" onclick="alert(event.type)">

IE 的 event 對(duì)象同樣也包含與創(chuàng)建它的事件相關(guān)的屬性和方法。其中很多屬性和方法都有對(duì)應(yīng)的或者相關(guān)的 DOM屬性和方法。所有事件對(duì)象都會(huì)包含下表所列的屬性和方法:

屬性/方法 類(lèi) 型 讀/寫(xiě) 說(shuō)明
cancelBubble Boolean 讀/寫(xiě) 默認(rèn)值為 false,但將其設(shè)置為 true,就可以取消事件冒泡(與DOM中的 stopPropagation() 方法的作用相同)
returnValue Boolean 讀/寫(xiě) 默認(rèn)值為 true,但將其設(shè)置為 false,就可以取消事件的默認(rèn)行為(與DOM中的 preventDefault() 方法的作用相同),但沒(méi)有辦法確定事件是否能被取消
srcElement Element 只讀 事件的目標(biāo)(與DOM中的 target 屬性相同)
type String 只讀 被觸發(fā)的事件的類(lèi)型

跨瀏覽器的事件對(duì)象

var EventUtil = {

    getEvent: function(event){
        return event ? event : window.event;
    },

    getTarget: function(event){
        return event.target || event.srcElement;
    },

    preventDefault: function(event){
        if (event.preventDefault){
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
    },

    stopPropagation: function(event){
        if (event.stopPropagation){
            event.stopPropagation();
        } else {
            event.cancelBubble = true;
        }
    },

    addHandler: function(element,type,handler){            
        if(element.addEventListener){ 
            element.addEventListener(type,handler,false); 
        }else if(element.attachEvent){                    
            element.attachEvent("on"+type,handler);
        }else{
            element["on"+type]=handler;             
        }
    },  

    removeHandler: function(element,type,handler){ 
        if(element.removeEventListener){
            element.removeEventListener(type,handler,false);
        }else if(element.detachEvent){
            element.detachEvent("on"+type,handler);
        }else{
            element["on"+type]=null;
        }
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容