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. C# winform多线程的小例子

    在文本框中输入一个数字,点击开始累加按钮,程序计算从1开始累计到该数字的结果.因为该累加过程比较耗时,如果直接在UI线程中进行,那么当前窗口将出现假死.为了有更好的用户体验,程序启动一个新的线程来单独 ...

  2. factor graph model

    主实验 文慧:用户,商品,评分,review,ranking. 数据集:数据规模,论文源代码

  3. javascript面试题(一)

    答案和解析在问题下一行,为白色字体 单选题 1.以下哪条语句会产生运行错误:(a) A.var obj = ();//语法错误 B.var obj = [];//创建数组 C.var obj = {} ...

  4. C# Task 用法

    C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...

  5. mvc的自带json序列化的datetime在js中的解析

    默认仅序列化后的日期格式是这样的:'/Date(124565787989)/'(数字随便敲的,数字表示相对于1970年的总毫秒数) 在js中借助eval函数,eval函数的意义:将参数中的字符串当作j ...

  6. ListView简介

    说起来,简介这种东西我一般都会去百度,不过似乎这样太没诚意了.╮(╯▽╰)╭ 没办法我再去查查别的资料 官方API,说的啥呢?经过一番研究我终于读懂了....╮(╯▽╰)╭ (让一个英语三级的学渣来分 ...

  7. jquery-ui-处理拖动位置Droppable,Draggable

    一.效果.如下图中,各途中可相互拖拉,右下角可删除.注意图1和图2对比区别 图1 图2 二.源码详解 html源码 <!DOCTYPE html> <html> <hea ...

  8. eclipse-插件安装的三种方式

    (前两种安装方式以多国语言包的安装为例) 1.  普通安装:用直接解压的安装方式来实现 解压插件到某个文件夹 将下载的插件文件解压到 Eclipse 的安装目录下 如插件文件为多国语言包: NLpac ...

  9. html中拼接字符串问题

    hmtl拼接问题: 今天在同事解决问题的时候发现 html <lable id="p"+@item.id></label> 拼接出来的是 p+5 <l ...

  10. tableView异步下载图片/SDWebImage图片缓存原理

    问题说明:假设tableView的每个cell上的imageView的image都是从网络上获取的数据.如何解决图片延迟加载(显示很慢).程序卡顿.图片错误显示.图片跳动的问题. 需要解决的问题: 1 ...