JavaScript中的事件对象

  JavaScript中的事件对象是非常重要的,恐怕是我们在项目中使用的最多的了。在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有关的信息。下面将会讲到DOM中的事件对象、IE中的事件对象以及跨浏览器的事件对象三个部分。

  对于事件处理程序,大家可以看我的博文《JavaScript中的五种事件处理程序》。

第一部分:DOM事件对象

  兼容DOM的浏览器会将一个event对象传入到事件处理程序中,无论是HMTL特性、DOM0级还是DOM2级,都会传入这个event对象。这个对象具有下面的属性和方法。

  DOM事件对象的属性有:

  • bubbles  布尔值 只读 表明事件是否冒泡
  • cancelable 布尔值 只读 表明是否可以取消事件的默认行为
  • currentTarget  元素 只读  表明事件处理程序正在处理的元素
  • defaultPrevented 布尔值 只读 表明是否调用了preventDefault()方法
  • detail 数值 只读 表明与事件相关的细节信息
  • eventPhase  数值 只读  表明事件处理程序的阶段:1为捕获阶段,2为处于目标阶段,3为冒泡阶段
  • target  元素 只读 事件的目标
  • trusted  布尔值  只读  true表示事件为浏览器生成,false表示开发人员通过js创建
  • type  字符串  只读  表明被触发事件的类型

  DOM事件对象的方法有:

  • preventDefault()   只读 用来取消事件的默认行为
  • stopPropagation()  取消事件的冒泡
  • stopImmediatePropagation() 取消事件的捕获或者冒泡(DOM3级新增方法)

  下面举例说明上述几个属性和方法的使用:

例1

preventDefault():此方法可以阻止事件的默认行为,比如,点击a标签,本来应该会跳转到相应的url,但是我们可以使用方法阻止,如下所示:

  

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>preventDefault</title>
</head>
<body>
<div id="wrap">
<div id="div">
<a id="link" href="http://www.cnblogs.com/zhuzhenwei918">918之初</a>
</div>
</div>
<script>
var link=document.getElementById("link");
link.addEventListener("click",function(){
alert(event.cancelable);//true 表示可以取消事件的默认行为
event.preventDefault();// 取消事件的默认行为
alert(event.type); //click 即事件对象类型即点击 click
alert(event.trusted);//undefined 可能是因为目前还不支持此属性
alert(event.defaultPrevented); //true,即默认被阻止,因为上面我们使用了preventDefault()方法
alert(event.eventPhase);//2 表示处于目标阶段
},false); var div=document.getElementById("div");
div.addEventListener("click",function(){
alert(event.target); //http://www.cnblogs.com/zhuzhenwei918 target为事件的实际目标 即a标签被点击之后,实际上是应该跳转的
alert(event.currentTarget);//[object HTML DivElement]
alert(this);//[object HTML DivElement],可以看出event.currentTarget 和this始终是相同的。
alert(event.bubbles);// true 表示事件冒泡
alert(event.eventPhase); //3 表示处于冒泡阶段
event.stopPropagation(); // 使用此方法来阻止继续向上冒泡
},false); var wrap=document.getElementById("wrap");
wrap.onclick=function(){
alert("wrap");//不显示,因为在之前已经阻止事件冒泡了。
}; </script>
</body>
</html>

例2:

实际上,我们也可以不使用event而是在function中传入一个参数来当作event使用(DOM0级和DOM2级都可以),如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>bubble</title>
<style>
button{
background: red;
color:white;
}
#third{
width: 50px;
height: 50px;
border:thin solid red;
}
#second{
width: 100px;
height: 100px;
border:thin solid red;
}
#first{
width:200px;
height: 200px;
border:thin solid red;
}
</style>
</head>
<body>
<div id="first">
<div id="second" >
<div id="third" >
<button id="button">事件冒泡</button>
</div>
</div>
</div>
<script>
document.getElementById("button").addEventListener("click",function(e){
alert(e.cancelable);//捕获被阻止,这里没有弹出窗口
},true); document.getElementById("third").addEventListener("click",function(e){
alert(e.currentTarget);//捕获被阻止,这里没有弹出窗口
},true); document.getElementById("second").addEventListener("click",function(e){
alert("second");//弹出窗口
e.stopImmediatePropagation(); //阻止事件捕获
},true); document.getElementById("first").addEventListener("click",function(e){
alert("first"); //弹出窗口
alert(e.eventPhase); //1处于捕获阶段
},true);
</script>
</body>
</html>

例3:

  实际上,利用event的type属性结合switch语句我们还可以做更多的事情!

  比如我们需要在点击按钮、划过按钮和划出按钮时做不同的事情,我们可以这样写(这里使用DOM0级添加事件处理程序,方法一样,事件对象依然是event,也可以传入一个参数,以该参数作为对象):

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>bubble</title>
<style>
#div{
width: 200px;
height: 200px;
}
</style>
</head>
<body>
<div id="div"></div>
<button id="button">点击我</button>
<script>
var button=document.getElementById("button");
var div=document.getElementById("div");
button.onclick=function(){
div.style.backgroundColor="red";
};
button.onmouseover=function(){
div.style.border="thin red solid";
};
button.onmouseout=function(){
alert("mouseout");
};
</script>
</body>
</html>

这样写当然可以得到想要的效果,但是我们还可以这样写:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>bubble</title>
<style>
#div{
width: 200px;
height: 200px;
}
</style>
</head>
<body>
<div id="div"></div>
<button id="button">点击我</button>
<script>
var button=document.getElementById("button");
var div=document.getElementById("div");
var handler=function(event){
switch(event.type){
case "click":
div.style.backgroundColor="red";
break;
case "mouseover":
div.style.border="thin red solid";
break; case "mouseout":
alert("mouseout");
break;
}
};
button.onclick=handler;
button.onmouseover=handler;
button.onmouseout=handler;
</script>
</body>
</html>

这样写的封装性似乎会更好一些!

例4

  html事件处理程序也可以使用event对象,只是这里不存在传入参数的问题了。。如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>html对象</title>
</head>
<body>
<button onclick="alert(event.type)">点我</button>
<!-- 点击之后弹出窗口click -->
</body>
</html>

到这就讲完了DOM中的事件对象,那么接下来就要谈谈特立独行的IE了。

第二部分:IE中的事件对象

  DOM中的事件对象时不需要区分我们是通过何种方式来添加事件处理程序的,如DOM0级、DOM2级和HTML事件处理程序,对象都直接使用event即可。而IE中却不是这么简单。

  我们把IE中的事件对象分为三种情况来讲

  • 第一种:DOM0级方法添加事件处理程序时的事件对象
  • 第二种:IE事件添加事件处理程序时的事件对象
  • 第三种:HTML方法添加事件处理程序时的事件对象

  

第一种:DOM0级方法添加事件处理程序的事件对象

  这时,event对象作为了window对象的一个属性。举例如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>对象</title>
</head>
<body>
<button id="button">点我</button>
<script>
var button=document.getElementById("button");
button.onclick=function(){
var event=window.event;
alert(event.type); //click 这在chrome中也可使用
};
</script>
</body>
</html>

第二种:IE事件添加事件处理程序时的事件对象

   这时需要有event对象传入事件处理程序函数中,如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>对象</title>
</head>
<body>
<button id="button">点我</button>
<script>
var button=document.getElementById("button");
button.attachEvent("click",function(event){
alert(event.type); //"click"
});
</script>
</body>
</html>

这里也可以通过window对象来访问event对象,不过最好还是使用传入参数的方法。

第三种:HTML事件处理程序中的对象

  这个方法与DOM中的相同。举例如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>对象</title>
</head>
<body>
<button id="button" onclick="alert(event.type)">点我</button>
<script> </script>
</body>
</html>

另外,IE中的事件对象也有和DOM对象相似的属性和方法,下面的属性和方法是其特有的:

  • cancelBubble  布尔值  可读可写  默认值为false,设置为true时可以取消事件的冒泡  与DOM中的stopPropagation()方法的作用类似
  • returnValue  布尔值  可读可写  默认值为true,设置为false时我们可以取消事件的默认行为,与DOM中的preventDefault()方法类似
  • srcElement 元素  只读  事件的目标 ,和DOM中的target属性相同
  • type  字符串 只读 即为被触发事件的类型

第三部分:跨浏览器的事件对象

  实际上,这一部分就是兼容前面两者实现对象的跨浏览器。在《探究JavaScript的五种事件处理程序》中用到了EventUtil对象,这里我们可以对之加强。

  

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>对象</title>
</head>
<body>
<button id="button" onclick="alert(event.type)">点我</button>
<script> var EventUtil={
addHandler:function(element,type,handler){
if(element.addEventListener){
element.addEventListener(type,handler,false);//注意:这里默认使用了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);//注意:这里默认使用了false(冒泡)
}else if(element.detachEvent){
element.detachEvent("on"+type,handler);
}else{
element["on"+type]=null;
}
},
stopPropagation:function(event){
if(event.stopPropagation){
event.stopPropagation();
}else{
event.cancelBubble=true;
}
}
};
</script>
</body>
</html>

其中,getEvent返回了event对象的引用,event是一般的对象,window.event时考虑了IE的对象。getTarget方法返回事件的目标。 preventDefault()方法阻止了事件的默认行为。stopPropagation方法阻止了事件的冒泡。

下面举一个简单的例子:

    var button=document.getElementById("button");
button.onclick=function(){
event=EventUtil.getEvent(event);//获得对象
EventUtil.stopPropagation(event); //阻止事件冒泡
alert("button clicked"); //弹出窗口
};
document.body.onclick=function(){
alert("body clicked");//未弹出窗口,因为阻止了事件冒泡
};

JavaScript中的事件对象的更多相关文章

  1. Javascript中的事件对象和事件类型

    接上次看JS的事件冒泡和捕获,所以顺带就把事件相关的知识都看完好了 而且想到一个好的学习方法,第一天自己看,第二天把前一天学习的东西写下来,一方面可以当复习,一方面当重新整理并且分享 事件对象 事件处 ...

  2. JavaScript 中的事件对象(读书笔记思维导图)

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

  3. javaScript中的事件对象event

    事件对象event,每当一个事件被触发的时候,就会随之产恒一个事件对象event,该对象中主要包括了关于该事件的基本属性,事件类型type(click.dbclick等值).目标元素target(我的 ...

  4. javaScript中的事件对象event是怎样

    事件对象event,每当一个事件被触发的时候,就会随之产恒一个事件对象event,该对象中主要包含了关于该事件的基本属性,事件类型type(click.dbclick等值).目标元素target(我的 ...

  5. 彻底理解javascript 中的事件对象的pageY, clientY, screenY的区别和联系。

    说到底, pageY, clientY, screenY的计算,就是要找到参考点, 它们的值就是: 鼠标点击的点----------- 和参考点指点----------的直角坐标系的距离 stacko ...

  6. java基础66 JavaScript中的事件、localtion对象、screen对象(网页知识)

    1.JavaScript中的事件注册 1.1.事件的注册方式 方式1:直接在html元素上注册 <body onLoad="ready()"></body > ...

  7. javascript event(事件对象)详解

    javascript event(事件对象)详解   1. 事件对象     1. 事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 什 ...

  8. javascript 中的事件机制

    1.javascript中的事件. 事件流 javascript中的事件是以一种流的形式存在的. 一个事件会也有多个元素同时响应. 有时候这不是我们想要的效果, 我们只是需要某个特定的元素相应我们的绑 ...

  9. 浅谈JavaScript中的事件

    引言 Html页面与JavaScript之间的交互是通过事件来完成的.事件,就是文档或者浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(处理程序)来预订事件,以便事件发生时执行相应的代码.这在传 ...

随机推荐

  1. OS存储器管理(二)

    离散分配 分页(Paging),分段,段页式 一.分页   一个进程的物理地址可以是非连续的:   将物理内存分成固定大小的块,称为块(frame): 将逻辑内存分为同样大小的块,称为页(page): ...

  2. VR的UI、UX设计原则

    国外其实有不少关于VR用户体验的研究 总结一下我所了解的: Cardboard Design Lab 1. 使用十字线(比较适用于移动VR.一体机) 2.有深度的UI与眼睛疲劳: 离眼睛近的UI,物体 ...

  3. Spearman Rank(斯皮尔曼等级)相关系数及MATLAB实现

    转自:http://blog.csdn.net/wsywl/article/details/5859751 Spearman Rank(斯皮尔曼等级)相关系数 1.简介 在统计学中,斯皮尔曼等级相关系 ...

  4. eclipse failed to load the jni jvm.dll

    问题:打开Eclipse弹出,eclipse failed to load the jni jvm.dll,一般都是本机的JDK与Eclipse位数不等{32-64,64-32} 解决:看本机Java ...

  5. 让所有的浏览器都支持html5

    <!--[if lt IE 9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js" ...

  6. Alpha版本冲刺现场演示和阶段验收的总结

    一共15个组.有13个组参加了今天的现场演示,分别是YZH.Radio Group.FZU5BOYS.静静看.Clean Code.Mod4.F4.For the Dream.Journey of C ...

  7. java知识点、重点知识点

    重点章节: 面对对象章节 重点知识点: Lambda表达式 数据:内存-->数据库 知识点一拦: 类.面向对象.对象.封装.继承.多态.消息.UML建模.数据类型(基本类型.引用类型).数据类型 ...

  8. 项目tomcat启动停在Initializing Spring root WebApplicationContext

    来源于:http://ourteam.iteye.com/blog/1270699 某日,再次启动项目,spring一直停在这一句: Initializing Spring root WebAppli ...

  9. selector 和 shape结合使用

    <?xml version="1.0" encoding="utf-8"?><selector xmlns:android="htt ...

  10. Android应用崩溃后异常捕获并重启并写入日志

    在Android开发时,有时会因为一些异常导致应用报错,偶尔会因为错误 而崩溃,导致用户体验下降,为了解决这问题,我们就要对这样的异常处理: 代码如下: CrashHandler.java impor ...