JavaScript中的事件对象
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中的事件对象的更多相关文章
- Javascript中的事件对象和事件类型
接上次看JS的事件冒泡和捕获,所以顺带就把事件相关的知识都看完好了 而且想到一个好的学习方法,第一天自己看,第二天把前一天学习的东西写下来,一方面可以当复习,一方面当重新整理并且分享 事件对象 事件处 ...
- JavaScript 中的事件对象(读书笔记思维导图)
在触发 DOM 上的某个事件时,会产生一个事件对象 event,这个对象中包含着所有与事件有关的信息.包括导致事件的元素.事件的类型以及其他与特定事件相关的信息.例如,鼠标操作导致的事件对象中,会包含 ...
- javaScript中的事件对象event
事件对象event,每当一个事件被触发的时候,就会随之产恒一个事件对象event,该对象中主要包括了关于该事件的基本属性,事件类型type(click.dbclick等值).目标元素target(我的 ...
- javaScript中的事件对象event是怎样
事件对象event,每当一个事件被触发的时候,就会随之产恒一个事件对象event,该对象中主要包含了关于该事件的基本属性,事件类型type(click.dbclick等值).目标元素target(我的 ...
- 彻底理解javascript 中的事件对象的pageY, clientY, screenY的区别和联系。
说到底, pageY, clientY, screenY的计算,就是要找到参考点, 它们的值就是: 鼠标点击的点----------- 和参考点指点----------的直角坐标系的距离 stacko ...
- java基础66 JavaScript中的事件、localtion对象、screen对象(网页知识)
1.JavaScript中的事件注册 1.1.事件的注册方式 方式1:直接在html元素上注册 <body onLoad="ready()"></body > ...
- javascript event(事件对象)详解
javascript event(事件对象)详解 1. 事件对象 1. 事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 什 ...
- javascript 中的事件机制
1.javascript中的事件. 事件流 javascript中的事件是以一种流的形式存在的. 一个事件会也有多个元素同时响应. 有时候这不是我们想要的效果, 我们只是需要某个特定的元素相应我们的绑 ...
- 浅谈JavaScript中的事件
引言 Html页面与JavaScript之间的交互是通过事件来完成的.事件,就是文档或者浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(处理程序)来预订事件,以便事件发生时执行相应的代码.这在传 ...
随机推荐
- JavaScript学习笔记-自定义滚动条
这是一个基本实现思路,如果有新手和我一样没什么事,喜欢瞎研究话,可以参考下. 一.Html <div class="scroll_con"> <div class ...
- 1020理解MySQL——索引与优化
转自http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性 ...
- A query was run and no Result Maps were found for the Mapped Statement 'user.insertUser!selectKey'. It's likely that neither a Result Type nor a Result Map was specified.
使用mybatis时出现异常问题: 有如下的错误 Error querying database. Cause: org.apache.ibatis.executor.ExecutorExceptio ...
- CAP理论
自打引入CAP理论的十几年里,设计师和研究者已经以它为理论基础探索了各式各样新颖的分布式系统,甚至到了滥用的程度.NoSQL运动也将CAP理论当作对抗传统关系型数据库的依据. CAP理论主张任何基于网 ...
- [转]为什么我要用 Node.js? 案例逐一介绍
原文地址:http://blog.jobbole.com/53736/ 介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样, ...
- Dubbo系列(1)_背景介绍和基本情况
一.本文目的 主要介绍Dubbo的产生背景和需要解决的问题 二.产生背景 随着大数据量.高并发的互联网应用越来越多,单机系统已经无法满足系统的需要.通过SOA搭建一个分 ...
- 如何更新firefox中的flash
要了解当前安装的版本是否为最新版本,请访问 插件检查页面http://www.mozilla.com/plugincheck/ ,如果该页面告诉你 Flash 插件需要更新,请手动安装最新版本. 使 ...
- js清除浏览器缓存的几种方法
2014年9月24日 4692次浏览 关于浏览器缓存 浏览器缓存,有时候我们需要他,因为他可以提高网站性能和浏览器速度,提高网站性能.但是有时候我们又不得不清除缓存,因为缓存可能误事,出现一些错误的数 ...
- yii自动登录
在yii,登录页面选择记住密码,下次就会自动登陆 前些天,自己增加了一个web应用,但是发现虽然选择记住密码,没选退出,关闭浏览器,重新进入还会跳转到登陆页面 自动登录是利用cookie实现的 配置U ...
- ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
看图: