JS—事件對象

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

  • 舉例
    鼠標操作導致的事件對象中,會包含鼠標位置的信息,
    鍵盤操作導致的事件對象中,會包含按下的鍵有關的信息,

所有瀏覽器都支持event對象,event對象會傳入DOM0級,DOM2級,HTML指定,的事件處理程序中,但支持的方式不同,所以也會涉及跨瀏覽器的部分。

  • 兼容DOM的瀏覽器
    function handler(){
    alert(event.type);
    };
    EventUtil.addHandler(btn,'click',handler);//接上篇筆記
    event:在支持至少DOM2級的瀏覽器內,無論使用html特性指定,dom0級,2級,該對象都是該事件內置對象,可以在事件處理函數內直接使用。
    this:在支持至少DOM2級的瀏覽器內,無論使用html特性指定,dom0級,2級,都是指向當前正在處理事件的那個元素。
  • 列舉所有事件的事件對象,都會有的成員。
屬性方法 類型 讀寫 說明
bubbles Blooean 只讀 表明事件是否冒泡
stopPropagation() Function 只讀 取消事件的進一步捕獲或冒泡,如果bubbels為true,則可以使用這個方法
cancelable Blooean 只讀 表明是否可以取消事件的默認行為
preventDefault() Function 只讀 取消事件的默認行為,如果cancelable為true,則可以使用這個方法
currentTarget Element 只讀 其事件處理程序當前正在處理事件的那個元素
target Element 只讀 事件的目標
detail Integar 只讀 與事件相關的細節信息
eventPhase Integar 只讀 調用事件處理程序的階段:1表示捕獲階段2表示處于目標3表示冒泡階段
trusted Blooean 只讀 為true表示事件是瀏覽器生成的,為false表示事件是由開發人員通過js創建的
type String 只讀 被觸發的事件的類型
view AbstractView 只讀 與事件關聯的抽象視圖。等同于發生事件的window對象
      • 成員中有兩個成員比較相似:
        currentTarget:this對象始終等于他的值,隨著事件冒泡或者捕獲,他得值等于捕獲或冒泡到的上級元素的值。
        target:只包含事件的實際目標。
    • type
      可以利用type屬性為一個元素同時添加多類事件處理程序。
      采用dom0級試試
      var btn=document.getElementById('d1');
      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;
      
    • cancelable、preventDefault()
      只有cancelable為true時,才可以使用preventDefault()方法,來取消其默認行為。
      <a id="myherf">百度</a>
      var Link=document.getElementById("myherf");
      Link.onclick=function(){
      event.preventDefault();
      }
      這樣單擊百度時,并不會跳轉到百度的頁面。

    • stopPropagation()
      立即停止事件在dom層次中的傳播,即取消進一步的事件捕獲或冒泡。
      function handler(){
      alert(event.type);
      event.stopPropagation();
      };

    • eventPahse
      用來確定事件當前位于事件流的哪個階段
      var btn=document.getElementById('d1');//body內的div
      var wrap=document.getElementById('wrap');//body
      function handler(){
      alert(event.eventPhase)
      };
      //單擊btn
      btn.addEventListener('click',handler,false);//2處于目標對象
      wrap.addEventListener('click',handler,false);//3冒泡階段
      wrap.addEventListener('click',handler,true);//1捕獲
      event對象只有在事件處理程序執行期間,才會存在,執行完畢即銷毀。

  • IE中的事件對象
    在IE8及其以前版本的瀏覽器是不兼容DOM2級的,但是還是可以使用dom0級的方法添加事件處理程序。
  • event
    • dom0級方法中:
      var div=document.getElementById("test");
      div.onclick=function(){
      var event=window.event;//event為window對象
      alert(event.type);
      }
    • 使用IE的專屬添加事件的方法,event對象作為事件處理程序的內部對象。可以直接使用event.type。
    • html指定:event對象同樣也包含于創建他的事件相關的屬性和方法。
  • this
    • dom0級方法中
      this等于正在處理事件的那個元素。
    • 使用IE的專屬
      this等于全局對象
    • html指定
      如果是在標簽上直接使用this,那么等于正在處理事件的那個元素。如果是使用標簽上指定函數,那么函數內的this指的是window。

看到了分歧,結果是必然要編寫一個可以跨瀏覽器的。

  • IE的event包含的對象與方法
屬性方法 類型 讀寫 說明
cancelBubble Blooean 讀/寫 默認值為false,但將其設置為true就可以取消事件冒泡,與DOM中stopPropagation()的方法作用相同
returnvalue Blooean 讀/寫 默認值為true,但將其設置為fasle,就可以取消事件的默認行為,與DOM中的preventDefault()方法的作用相同
srcElement Element 只讀 事件的目標,與DOM中的target屬性相同
type String 只讀 被觸發的事件類型
    • returnvalue
      var div=document.getElementById("test");
      div.onclick=function(){
      window.event.returnValue=false;
      }
      但是沒有辦法判定默認事件能否被取消。
  • cancelBubble
    var div=document.getElementById("test");
    div.onclick=function(){
    alert('ok')
    window.event.cancelBubble=true;
    }
    因為IE8及以前只支持冒泡所以只能取消冒泡。

  • 跨瀏覽器的事件對象
    這個面試會問道的,寫一個通用的事件偵聽函數!就寫下面的就可以!bingo!
    var EventUtil={
    getEvent:function(event){
    return event||window.event;
    },
    getTarget:function(event){
    return event.target||event.srcElement;
    },
    preventDefault:function(){
    if(event.preventDefault){
    event.preventDefault();
    }else{
    event.returnValue=false;
    }
    },
    stopPropagation:function(){
    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["e"+type]=function(){
    handler.call(element)
    }
    element.attachEvent("on"+type,element["e"+type]);
    }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,element["e"+type]);
    element["e"+type]=null;
    }else{
    element["on"+type]=null;
    }
    }

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

推薦閱讀更多精彩內容

  • 事件流: 事件流:頁面接收事件的順序。 IE定義的:事件冒泡流(由最具體的元素依次傳播到DOM樹的最上層的Docu...
    xiaoguo16閱讀 602評論 0 0
  • 在觸發DOM上的某個事件時,會產生一個事件對象event,這個對象中包含著所有與事件有關的信息。 DOM中的事件對...
    FeRookie閱讀 316評論 0 3
  • 聲明:本文來源于http://www.webzsky.com/?p=731我只是在這里作為自己的學習筆記整理一下(...
    angryyan閱讀 7,080評論 1 6
  • 事件對象 在觸發DOM上的某個事件時,會產生一個事件對象event,這個對象中包含著所有與事件有關的信息。包括導致...
    落花的季節閱讀 172評論 0 1
  • 閱讀這本書的時候我絕對是戰戰兢兢的。手機不敢碰,朋友圈不敢刷,生怕被作者說中:“你沒有深度工作!” 深度工作簡單來...
    喵小游閱讀 278評論 0 0