JavaScript事件对象详解

在触发DOM上的某个事件时,会产生一个事件对象event。这个对象中包含着所有与事件有关的信息。包括导致事件的元素,事件的类型以及其他与特定事件相关的信息。

  • 举例
    鼠标操作导致的事件对象中,会包含鼠标位置的信息,
    键盘操作导致的事件对象中,会包含按下的键有关的信息,

所有浏览器都支持event对象,event对象会传入DOM0级,DOM2级,HTML指定的事件处理程序中,但支持的方式不同,所以也会涉及跨浏览器的部分。我们可以结合HTML DOM Event 对象来学习。
我们知道,特定的事件会有自己独特的属性,我们这里只看一些共有的属性


1.标准浏览器

event:在支持至少DOM2级的浏览器内,无论使用html特性指定,dom0级,2级,该对象都是该事件内置对象,可以在事件处理函数内直接使用。
this:在支持至少DOM2级的浏览器内,无论使用html特性指定,dom0级,2级,都是指向当前正在处理事件的那个元素。
列举所有事件的事件对象,都会有的成员。

列举所有事件的事件对象,共同拥有的成员。

属性方法 类型 读写 描述
bubbles Blooean 只读 表明事件是否是起泡事件类型
cancelable Blooean 只读 表明是否可以取消事件的默认行为
currentTarget Element 只读 其事件处理程序当前正在处理事件的那个元素
target Element 只读 事件的目标
eventPhase Integar 只读 调用事件处理程序的阶段:1表示捕获阶段2表示处于目标3表示冒泡阶段
trusted Blooean 只读 为true表示事件是浏览器生成的,为false表示事件是由开发人员通过js创建的
type String 只读 被触发的事件的类型
stopPropagation() Function 只读 取消事件的进一步捕获或冒泡,如果bubbels为true,则可以使用这个方法
preventDefault() Function 只读 取消事件的默认行为,如果cancelable为true,则可以使用这个方法
initEvent() Event 只读 初始化新创建的 Event 对象的属性
  • currentTarget:始终等于this对象,随着事件冒泡或者捕获,他的值等于捕获或冒泡到的上级元素。

  • target :触发此事件的元素。

  • type
    可以利用type属性为一个元素同时添加多类事件处理程序。
    采用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
    用来确定事件当前位于事件流的哪个阶段
var btn=document.getElementById('Mybtn');//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捕获
  • cancelable、preventDefault()
    只有cancelable为true时,才可以使用preventDefault()方法,来取消其默认行为。
    ie低版本通过:event.returnValue=false来实现
<a href="http://www.baidu.com/" id="myherf">百度</a>
  var Link=document.getElementById("myherf");
  Link.onclick=function(){
     event.preventDefault();
  }

这样单击百度时,并不会跳转到百度的页面。

  • stopPropagation()
    立即停止事件在dom层次中的传播,即取消进一步的事件捕获或冒泡。
    ie通过event.cancelBubble=true;阻止传播
 function handler(){
     alert(event.type);
     event.stopPropagation();
 };

event对象只有在事件处理程序执行期间,才会存在,执行完毕即销毁。


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 对象的一个属性。event对象作为事件处理程序的内部对象。可以直接使用event.type。
html指定:event对象同样也包含于创建他的事件相关的属性和方法。

this:
html指定
html标签上直接使用this,那么等于正在处理事件的那个元素。如果是使用标签上指定函数,那么函数内的this指的是window。
dom0级方法中
this等于正在处理事件的那个元素。
使用IE的专属 attachEvent()
this等于window

  • IE的event包含的对象与方法
属性方法 类型 读写 说明
cancelBubble Blooean 读/写 默认值为false,但将其设置为true就可以取消事件冒泡,与DOM中stopPropagation()的方法作用相同
returnvalue Blooean 读/写 默认值为true,但将其设置为fasle,就可以取消事件的默认行为,与DOM中的preventDefault()方法的作用相同
srcElement Element 只读 事件的目标,与DOM中的target属性相同
  • 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及以前只支持冒泡所以只能取消冒泡。

既然事件对象存在浏览器兼容问题,那么封装一个跨浏览器的事件对象就很有必要!
跨浏览器的事件对象我在前面的JavaScript事件——事件冒泡,事件捕获,事件绑定与解绑,事件委托的文章末尾已经给出过了。

谢谢观看!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容