事件對象

在觸發DOM上的某個事件時,會產生一個事件對象event,這個對象中包含著所有與事件有關的信息:導致事件的元素、事件的類型、其他與特定事件相關的信息。

DOM中的事件對象

兼容DOM的瀏覽器會將一個event對象傳入到事件處理程序中,無論指定事件處理程序時使用什么方法(DOM0級或DOM2級),都會傳入event對象。如下:

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

event對象包含與創建它的特定事件有關的屬性和方法。出發的事件類型不一樣,可用的屬性和方法也不一樣。

  • 在需要通過一個函數處理多個事件時,可以使用type屬性。如下:
    var btn=document.getElementById("myBtn");
        var handler=function(event){
            switch(event.type){
                case "click":
                alert("Clicked");
                break;
    
                case "mouseover":
                event.target.style.backgroundColor="red";
                break;
    
                case "mouseout":
                event.target.style.backgroundColor="";
                break;
            }
        };
        btn.onclick=handler;
        btn.onmouseover=handler;
        btn.onmouseout=handler;
  • 要阻止特定事件的默認行為,可以使用preventDefault()方法。例如,鏈接的默認行為就是在被單擊時會導航到其href特性指定的URL。如果你想阻止鏈接導航這一默認行為,那么通過鏈接的onclick事件處理程序可以取消它。
 var link=document.getElementById("myLink");
     link.onclick=function(event){
         event.preventDefault();
     }

只有cancelable屬性設置為true的事件,才可以使用preventDefault()來取消其默認行為。

  • stopPropagation()方法用于立即停止事件在DOM層次中的傳播,即取消進一步的事件捕獲或冒泡。
    var btn=document.getElementById("myBtn");
        btn.onclick=function(event){
            alert("Clicked");
            event.stopPropagation();//去掉該句會出現兩個警告框,先是clicked,再是Body clicked。
        };
        document.body.onclick=function(event){
            alert("Body clicked");
        };

對于這個例子而言,因為調用了stopPropagation(),所以在單價按鈕時click事件不會傳播到document.body。

  • 事件對象的eventPhase屬性,可以用來確定事件當前正位于事件流的哪個階段。在捕獲階段調用事件處理程序,eventPhase等于1;如果事件處理程序處于目標對象上,eventPhase等于2;如果在冒泡階段調用事件處理程序,eventPhase等于3.注意,盡管“處于目標”發生在冒泡階段,但eventPhase仍等于2.
    var btn=document.getElementById("myBtn");
    btn.onclick=function(event){
        alert(event.eventPhase);  //2
    };
    document.body.addEventListener("click",function(event){
        alert(event.eventPhase);   //1
    },true);
    document.body.onclick=function(event){
        alert(event.eventPhase);   //3
    };

當單擊按鈕時,首先執行的事件處理程序是在捕獲階段觸發的添加到document.body中的那一個,所以會先彈出表示eventPhase的1 。接著會觸發按鈕上注冊的事件處理程序,此時的eventPhase的值為2。最后一個被觸發的事件處理程序,是在冒泡階段執行的添加到document.body上的那一個,顯示的值是3。當eventPhase的值為2時,this、target、和currentTarget始終是相等的。

IE中的事件對象

要訪問IE中的event對象,取決于指定事件處理程序的方法。

  1. 在使用DOM0級方法添加事件處理程序時,event對象作為window對象的一個屬性存在。
    var btn=document.getElementById("myBtn");
        btn.onclick=function(){
            var event=widnow.event;
            alert(event.type);  //"click"
        };
  1. 如果事件處理程序是使用attachEvent()添加的,那么就會有一個event對象作為參數被傳入事件處理程序函數中去。
    var btn=document.getElementById("myBtn");
        btn.attachEvent("onclick",function(event){
          alert(event.type);     //"click"
        });

在像這樣使用attachEvent()的情況下,也可以通過window對象來訪問event對象。

  1. 如果是通過HTML特性指定的事件處理程序,還可以通過一個名叫event的變量來訪問event對象,如下:
<input type="button" value="Click Me" onclick="alert(event.type)" >

IE事件對象會包含下表所列的屬性和方法

  • 因為事件處理程序的作用域是根據指定它的方式來確定的,所以不能認為this會始終等于事件目標,最好使用event.srcElement比較保險 。
    var btn=document.getElementById("myBtn");
        btn.onclick=function(){
            alert(window.event.srcElement===this);   //true
        };
        btn.attachEvent("onclick",function(event){
          alert(event.srcElement===this);     //false
        });
  • returnValue屬性相當于DOM中的preventDefault()方法,它們的作用都是取消給定事件的默認行為。只要將returnValue設置為false,就可以阻止默認行為。
  • cancelBubble屬性:

跨瀏覽器的事件對象:

var EventUtil={
        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;
            }
        },
        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;
            }
        },

        removeHandler:function(element,type,handler){
            if(element.removeEventListener){
                element.removeEventListener(type,handler,false);
            } else if(element.detchaEvent){
                element.detchaEvent("on"+type,handler);
            } else{
                element["on"+type]=null;
            }
        },
        stopPropagation:function(event){
            if(event.stopPropagation){
                event.stopPropagation();
            }else{
                event.cancelBubble=true;
            }
        }
    };

使用方法:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容

  • 本文主要談及問題: 關于編寫跨瀏覽器的事件處理函數和事件對象 關于編寫跨瀏覽器的事件處理函數和事件對象 為什么要編...
    JimmyChung閱讀 2,141評論 0 4
  • 事件對象 在觸發DOM上的某個事件時,會產生一個事件對象event,這個對象中包含著所有與事件有關的信息。包括導致...
    落花的季節閱讀 172評論 0 1
  • 觸發DOM上的某個事件時,會產生一個事件對象event,這個對象中包含著所有與事件有關的額信息。(包括導致事件的元...
    Wonder233閱讀 392評論 0 0
  • JavaScript 程序采用了異步事件驅動編程模型。在這種程序設計風格下,當文檔、瀏覽器、元素或與之相關的對象發...
    劼哥stone閱讀 1,271評論 3 11
  • 我發現,當慢慢長大,我開始變得喜歡那些極簡又有質感的東西,不用花里胡哨,不用功能繁多,只要最大限度的發揮它原本...
    JasmineLris閱讀 426評論 0 0