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之间的交互是通过事件来完成的.事件,就是文档或者浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(处理程序)来预订事件,以便事件发生时执行相应的代码.这在传 ...
随机推荐
- re模块(正则表达式)
re 模块:正则表达式import re 内置模块: 1> re.match(pattern,string) pattern:就是正则表达式 string:被操作的对象 match,search ...
- Dubbo系列_概述
一.本文目的 学习使用Dubbo也有一段时间了,准备写一个系列文章介绍Dubbo的相关知识和使用,供自己以后回顾和他人学习.有兴趣的同学可以加入群:74085440一起探讨 二.书写计 ...
- 【BZOJ 2152】聪聪可可 点分治
对于一棵树,fdrt找到重心,然后分治每个子树. 在一棵以重心为根的树上,符合条件的链是: 1.过重心(根) 2.不过重心 对于1我们只需dfs出距离重心(根)的距离然后统计再减去有重叠的边 对于2我 ...
- 逻辑回归&&code
没有正则化项的时候的二分类 #-*-coding=utf-8-*- from numpy import loadtxt,where, transpose import matplotlib.pyplo ...
- java环境变量设置
java环境变量设置 1.打开我的电脑--属性--高级--环境变量 2.新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:C:\Program Files\Ja ...
- 使用kuernetes提供高可用的kibana服务
在kubernetes集群中部署kibana步骤如下: 1:kibana安装文件(目前最新版本4.5.1): 2:编写Dockerfile及执行点脚本文件run.sh,制作Kibana镜像: 3:推送 ...
- quartz启动时间配置
这些星号由左到右按顺序代表 : * * * * * * * 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , ...
- Echarts-画堆积柱状图
导入echarts包 <script src='../scripts/libraries/echarts/echarts-all.js'></script> 堆积图js $(f ...
- Mysql-ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'
方法一:1.关闭mysql # service mysqld stop2.屏蔽权限 # mysqld_safe --skip-grant-table 屏幕出现: Starting demo ...
- Asp.net Mvc 使用EF6 code first 方式连接MySQL总结
最近由于服务器变更为Linux系统.MsSql for Linux什么时候出来到生产环境使用还是要很长时间的.于是考虑使用Mysql数据库,ORM使用EF.于是先踩下坑顺便记录一下,有需要的tx可以参 ...