前言:这是笔者学习之后自己的理解与整理。如果有错误或者疑问的地方,请大家指正,我会持续更新!

  在触发DOM上的某个事件时,会产生一个事件对象 event,这个对象中包含着所有与事件有关的信息。所有浏览器都支持 event 对象,但有兼容性问题。

获取事件对象

  一般地,event 对象是事件程序的第一个参数。IE8及以下浏览器不支持;

  另一种方法是直接使用 event 变量,firefox 浏览器不支持;

  获取事件对象的常见兼容写法:

        <div id="box" style="height:200px;width:200px;background:pink;"></div>
<script>
var oBox = document.getElementById('box');
oBox.onclick = function(ev){
ev = ev || event;//获取事件对象的常见兼容写法
box.innerHTML = ev;
}
</script>

事件类型

  事件有很多类型,事件对象中的 type 属性表示被触发的事件类型;

        <div id="box" style="height:200px;width:200px;background:pink;"></div>
<script>
var oBox = document.getElementById('box');
oBox.onclick = function(ev){
ev = ev || event;//获取事件对象的常见兼容写法
box.innerHTML = ev.type;//事件对象中的type属性表示被触发的事件类型
}
</script>

事件目标

  关于事件目标,共有 currentTarget、target 和 srcElement 这三个属性;

  currentTarget 属性返回事件当前所在的节点,即正在执行的监听函数所绑定的那个节点;IE8及以下浏览器不支持 ;

  currentTarget 与事件中的 this 指向相同;

  target 属性返回事件的实际目标节点;IE8及以下浏览器不支持;

  srcElement 属性与 target 属性功能一致,返回事件的实际目标节点;firefox 浏览器不支持;

        <style type="text/css">
#box{height:200px;width:200px;background-color:pink;}
#child{height: 100px;width: 100px;background-color: green;}
</style>
<div id="box">
<div id="child"></div>
</div>
<script>
var oBox = document.getElementById('box');
var oChild = document.getElementById('child');
oBox.onclick = function(ev){
ev = ev || event;
//currentTarget属性返回事件当前所在的节点,即正在执行的监听函数所绑定的那个节点
console.log(ev.currentTarget);//<div id="box">...</div> //currentTarget与事件中的this指向相同
console.log(ev.currentTarget === this);//true //target属性返回事件的实际目标节点,IE8及以下浏览器不支持
//srcElement 属性与 target 属性功能一致,返回事件的实际目标节点;firefox 浏览器不支持;
//兼容性写法:
var target = ev.target || ev.srcElement;
console.log(target);//<div id="child"></div>
}
</script>

事件代理

  由于事件会在冒泡阶段向上传播到父节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件。这种方法叫做事件的代理(delegation),也叫事件委托;

  事件代理应用事件目标的 target 和 srcElement 属性完成。利用事件代理,可以提高性能及降低代码复杂度;

        <style>
#box{background-color: pink;}
.in{height: 30px;}
</style>
<ul id="box">
<li class="in">1</li>
<li class="in">2</li>
<li class="in">3</li>
<li class="in">4</li>
<li class="in">5</li>
</ul>
<script>
var oBox = document.getElementById('box');
oBox.onmouseover = function(ev){
ev = ev || event;
var target = ev.target || ev.srcElement;
target.style.backgroundColor = 'lightblue';
}
oBox.onmouseout = function(ev){
ev = ev || event;
var target = ev.target || ev.srcElement;
target.style.backgroundColor = 'pink';
}
</script>

事件冒泡

  事件冒泡是事件流的第三个阶段,通过事件冒泡可以在这个阶段对事件做出响应;

  关于冒泡,事件对象中包含 bubbles、cancelBubble、stopPropagation() 和 stopImmediatePropagation() 这四个相关的属性和方法;

  bubbles 属性返回一个布尔值,表示当前事件是否会冒泡。该属性为只读属性。发生在文档元素上的大部分事件都会冒泡,但 focus、blur 和 scroll 事件不会冒泡。所以,除了这三个事件 bubbles 属性返回 false 外,其他事件该属性都为true;

  stopPropagation() 方法表示取消事件的进一步捕获或冒泡,但无法阻止同一事件的其他监听函数被调用,无返回值。IE8及以下浏览器不支持;

  stopImmediatePropagation() 方法不仅可以取消事件的进一步捕获或冒泡,而且可以阻止同一个事件的其他监听函数被调用,无返回值。IE8及以下浏览器不支持;

        <div id="box" style="height: 200px;width: 200px; background-color: pink;"></div>
<script>
var oBox = document.getElementById('box');
oBox.onclick = function(ev){
ev = ev || event;
//bubbles 属性返回一个布尔值,表示当前事件是否会冒泡
console.log(ev.bubbles);//true
}
oBox.addEventListener('click',function(ev){
ev = ev || event;
//stopPropagation() 方法表示取消事件的进一步捕获或冒泡,
ev.stopPropagation();
oBox.innerHTML +='stopPropagation() 方法表示取消事件的进一步捕获或冒泡<br/>';
}) //stopPropagation() 方法表示取消事件的进一步捕获或冒泡,但无法阻止同一事件的其他监听函数被调用
oBox.addEventListener('click',function(ev){
ev = ev || event;
oBox.innerHTML += '但无法阻止同一事件的其他监听函数被调用';
}) document.body.onclick = function(ev){
oBox.innerHTML += '冒泡已被阻止';
}
</script>

  cancelBubble 属性只能用于阻止冒泡,无法阻止捕获阶段。该值可读写,默认值是false。当设置为 true 时,cancelBubble 可以取消事件冒泡;该属性全浏览器支持,但并不是标准写法;

        <script type="text/javascript">
var handler = function(ev){
ev = ev || event;
if(ev.stopPropagation){
ev.stopPropagation();
}else{
ev.cancelBubble = true;
}
}
</script>

事件流

  eventPhase 属性返回一个整数值,表示事件目前所处的事件流阶段,IE8及以下浏览器不支持;

  0表示事件没有发生,1表示捕获阶段,2表示目标阶段,3表示冒泡阶段;

取消默认行为

  关于取消默认行为的属性包括 cancelable、defaultPrevented、preventDefault() 和 returnValue ;

  cancelable 属性返回一个布尔值,表示事件是否可以取消。该属性为只读属性。返回true时,表示可以取消。否则,表示不可取消;IE8及以下浏览器不支持;

  defaultPrevented 属性表示默认行为是否被阻止,返回 true 时表示被阻止,返回 false 时,表示未被阻止;IE8及以下浏览器不支持;

        <div id="box" style="height: 200px;width: 200px; background-color: pink;"></div>
<script>
var oBox = document.getElementById('box');
oBox.onclick = function(ev){
ev = ev || event;
//cancelable 属性返回一个布尔值,表示事件是否可以取消
console.log(ev.cancelable );//true
//defaultPrevented 属性表示默认行为是否被阻止
console.log(ev.defaultPrevented );//false
}
</script>

  preventDefault() 方法取消浏览器对当前事件的默认行为,无返回值;IE8及以下浏览器不支持;

        <div id="box" style="height: 200px;width: 200px; background-color: pink;"></div>
<script>
var oBox = document.getElementById('box');
oBox.onclick = function(ev){
ev = ev || event;
//cancelable 属性返回一个布尔值,表示事件是否可以取消
console.log(ev.cancelable );//true
//defaultPrevented 属性表示默认行为是否被阻止
console.log(ev.defaultPrevented );//false //preventDefault() 方法取消浏览器对当前事件的默认行为
ev.preventDefault();
//defaultPrevented 属性表示默认行为是否被阻止
console.log(ev.defaultPrevented );//true
}
</script>

  returnValue 属性可读写,默认值是true,但将其设置为 false 就可以取消事件的默认行为,与 preventDefault() 方法的作用相同;firefox 和 IE9及以上浏览器不支持;

  兼容性写法:

        <script type="text/javascript">
var handler = function(e){
ev = ev || event;
if(ev.preventDefault){
ev.preventDefault();
}else{
ev.returnValue = false;
}
}
</script>

jacascript 事件对象event的更多相关文章

  1. 重新审视事件对象event

    前言:之前在学习事件对象event时,一是一直在chrome浏览器(作为主运行环境)下运行调试自个儿程序,二是可能当时对事件对象理解不透彻才导致现在对事件对象的用法陷入了一个大坑,遂以此篇博客记之. ...

  2. 谈谈事件对象-event

    JavaScript 中的事件对象(event) 当我们每次触发一种事件(如点击事件),我们会在回调函数中传入事件对象event.今天就来来谈谈. 1.当我们想判断当前事件是我们想要的事件类型时,可以 ...

  3. JavaScript:事件对象Event和冒泡

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 绑定事件的两种方式 我们在上一篇文章中已经讲过事件的概念.这里讲一下注册 ...

  4. javaScript中的事件对象event

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

  5. Javascript和jquery事件--事件对象event

    1.  事件对象event 对于event,js的解释是Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态.而jq的解释是事件处理(事件对象.目标元素 ...

  6. js进阶课程 12-9 jquery的事件对象event的方法有哪些?

    js进阶课程 12-9 jquery的事件对象event的方法有哪些? 一.总结 一句话总结:三组六个,阻止默认事件一组,阻止冒泡一组,阻止冒泡和剩余事件一组. 1.事件的默认动作指什么? 比如点a标 ...

  7. JS-特效 ~ 03. 楼层跳跃、事件对象event的获取与使用、event的主要内容、screenX、pageX、clientX的区别、放大镜、模拟滚动条

    楼层跳跃 100%子盒子会继承父盒子的宽高.父盒子继承body宽高.Body继承html的宽高. 盒子属性:auto:适应盒子自身的宽度或者高度.(对自己负责) 盒子属性:100%:适应盒子父盒子的宽 ...

  8. js 事件对象event

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

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

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

随机推荐

  1. 微信小程序学习笔记(阶段二)

    二阶段学习过程: (一)看官方文档的框架.组件.API:https://mp.weixin.qq.com/debug/wxadoc/dev/ (二)看极客学院第3.4章视频:http://www.ph ...

  2. C#设置和获取系统环境变量

    C#设置和获取环境变量 1.前言 本来想拿学校机房的Android编辑器直接粘到自己电脑上用,发现它的eclipse是 32位的,而我的JDK是64位的,于是想到干脆装两个JDK,用C#做一个能够更改 ...

  3. elementUI源码修改定制

    1.修改elementUI源码 首先从Git上克隆代码或者下载代码包 进入文件夹打开终端或Git Bash Here,运行npm install 安装依赖包.npm run dev 打开网页http: ...

  4. 【Windows】定时任务设置

    Windows定时任务 linux上面的定时任务已经解除过好多次了.不外乎crontab,at之类的命令,而windows上的定时任务今天才偶尔看到怎么设置.想到以后生活上可能会用到一些这方面的知识就 ...

  5. 【Python】 压缩文件处理 zipfile & tarfile

    [zipfile] 虽然叫zipfile,但是除了zip之外,rar,war,jar这些压缩(或者打包)文件格式也都可以处理. zipfile模块常用的一些操作和方法: is_zipfile(file ...

  6. JVM学习六:JVM之类加载器之双亲委派机制

    前面我们知道类加载有系统自带的3种加载器,也有自定义的加载器,那么这些加载器之间的关系是什么,已经在加载类的时候,谁去加载呢?这节,我们将进行讲解. 一.双亲委派机制 JVM的ClassLoader采 ...

  7. web服务器学习1---httpd-2.4.29源码手动编译安装

    环境准备: 系统:CentOS 7.4 软件:httpd-2.4.29 一  Apache主要特点 apache服务器在功能,性能和安全性等方面表现比较突出,可以较好地满足web服务器地应用需求.主要 ...

  8. js中的类型转换

    先介绍一下 typeof 的使用方法: typeof(mix)   或者  typeof  mix 其中 mix 可以是任何数据类型 typeof 的返回值有六种:number.string.bool ...

  9. 测试工作中经常用到的几个Linux命令(第一弹)

    自己平时测试工作中经常要在Linux下搭建测试环境,有涉及到启动/终止服务器,修改tomcat配置文件,偶尔碰到端口被占用... 这时就不得不需要一些基本的Linux命令来处理遇到的这些问题(顺便迈向 ...

  10. 团队作业4——第一次项目冲刺(Alpha版本)11.14

    a. 提供当天站立式会议照片一张 举行站立式会议,讨论项目安排: PM对整个项目的需求进行讲解: 全队对整个项目的细节进行沟通: 对整个项目的开发计划进行分析,分配每天的任务: 统一确定项目的开发环境 ...