理解JavaScript事件对象


Posted in Javascript onJanuary 25, 2016

在触发DOM上的某个事件时,会产生一个事件对象event。

DOM中的事件对象

兼容DOM的浏览器会将一个event对象传入到事件处理程序中。event对象包含与创建它的特定事件有关的属性和方法。除法的事件类型不一样,可用的属性方法就不一样。不过,所有的事件都会有下表列出的成员。

下面列出了 2 级 DOM 事件标准定义的属性:

  • bubbles: 返回布尔值,指示事件是否是起泡事件类型。
  • cancelable: 返回布尔值,指示事件是否可拥可取消的默认动作。
  • currentTarget: 返回其事件监听器触发该事件的元素。
  • eventPhase: 返回事件传播的当前阶段。
  • target: 返回触发此事件的元素(事件的目标节点)。
  • timeStamp: 返回事件生成的日期和时间。
  • type: 返回当前 Event 对象表示的事件的名称。

下面列出了 2 级 DOM 事件标准定义的方法。IE 的事件模型不支持这些方法:

  • initEvent(): 初始化新创建的 Event 对象的属性。
  • preventDefault(): 通知浏览器不要执行与事件关联的默认动作。
  • stopPropagation(): 不再派发事件。

this、target、currentTarget

在事件处理程序的内部,对象this始终等于currentTarget的值,而target则只包含事件的实际目标。如果直接将事件处理程序指定给了目标元素,则this、currentTarget和target包含相同的值。如:

var btn = document.querySelector("#btn");
btn.onclick=function () {
  console.log(event.currentTarget === this); //true
  console.log(event.target === this); //true
}

由于click事件的目标是btn按钮,所以这三个值是相等的。如果事件处理程序在按钮的父节点(document.body)中,那么这些值则不相同。如:

var btn = document.querySelector("#btn");
document.body.onclick=function () {
  console.log(event.currentTarget === document.body); //true
  console.log(this === document.body); //true
  console.log(event.target === btn); //true 因为btn没有注册事件处理程序,所以该click事件就冒泡到了document.body
}

在这里,this和currentTarget都是document.body,因为事件处理程序是注册到这个元素上的。但是target元素却等于按钮元素,因为它是click事件的真正目标。由于按钮并没有注册事件处理程序,结果click事件就冒泡到了document.body,在那里事件才能得到处理。

1、type

在需要通过一个函数处理多个事件时,可以使用type属性。如:

//获取按钮
var btn = document.querySelector("#btn");
//设置多个事件
var handler = function() {
//检测事件的类型
  switch (event.type) {
    case "click":
      console.log("i click it");
      break;
    case "mouseover":
      console.log("i enter it");
      break;
    case "mouseout":
      console.log("i leave it");
      break;
  }
}
//给响应的事件赋值
btn.onclick = handler;
btn.onmouseover = handler;
btn.onmouseout = handler;

2、preventDefault()

要阻止特定事件的默认行为,可以使用该方法。如:

var aTags = document.getElementsByTagName("a");
for (var i = 0; i < aTags.length; i++) {
  var currentATag = aTags[i];
  currentATag.onclick = function() {
    event.preventDefault();
  }
};

以上代码即屏蔽了网页上全部的a标签超链接功能。要注意的是,只有cancelable属性设置为true的事件,才可以使用preventDefault()来取消其默认行为。

3、stopPropagation()

立即停止事件在DOM层次中的传播,即取消进一步的事件捕获或冒泡。例如,直接添加到一个按钮的事件处理程序可以调用该方法,从而避免触发注册在document.body上面的事件处理程序。如:

var btn = document.getElementById("btn");
btn.onclick = function () {
  console.log("btn clicked");
  // event.stopPropagation();
};
window.onclick = function () {
  console.log("clicked");
};
//单击一下的结果:
//btn clicked
//clicked

又如:

var btn = document.getElementById("btn");
btn.onclick = function () {
  console.log("btn clicked");
  event.stopPropagation();
};
window.onclick = function () {
  console.log("clicked");
};
//单击一下的结果:
//btn clicked

eventPhase

该属性用来确定事件当前正位于事件流的哪个阶段。

  • 如果是捕获阶段则等于1;
  • 如果是目标对象阶段则等于2;
  • 如果是冒泡阶段则等于3;

如:

var btn = document.getElementById("btn");

document.body.addEventListener("click", function() {
  console.log("bodyListener" + event.eventPhase);
}, true) //捕获阶段

btn.onclick = function() {
  console.log("btn" + event.eventPhase);
} //目标对象阶段,实际上属于冒泡阶段(在btn上)

document.body.onclick = function() {
  console.log("body" + event.eventPhase);
} //冒泡阶段(在body上)

又如:

var btn = document.getElementById("btn");

document.body.addEventListener("click", function() {
  console.log(event.eventPhase); //1
  console.log(event.currentTarget); //HTMLBodyElement
}, true);

btn.addEventListener("click", function() {
  console.log(event.eventPhase); //2
  console.log(event.currentTarget); //HTMLInputElement
});

document.body.addEventListener("click", function() {
  console.log(event.eventPhase); //3
  console.log(event.currentTarget); //HTMLBodyElement
});

流程大概是:

document.body 捕获阶段 --> btn 目标对象阶段 --> document.body 冒泡阶段

以上就是关于JavaScript事件对象,希望对大家的学习有所帮助。

Javascript 相关文章推荐
Prototype Template对象 学习
Jul 19 Javascript
js实现一个省市区三级联动选择框代码分享
Mar 06 Javascript
JQuery实现倒计时按钮具体方法
Nov 14 Javascript
jQuery中;function($,undefined) 前面的分号的用处
Dec 17 Javascript
原生js模拟淘宝购物车项目实战
Nov 18 Javascript
原生 JS Ajax,GET和POST 请求实例代码
Jun 08 Javascript
echarts3 使用总结(绘制各种图表,地图)
Jan 05 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
Jun 08 jQuery
jQuery中.attr()和.data()的区别分析
Sep 03 jQuery
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
Jun 18 jQuery
ES6如何用一句代码实现函数的柯里化
Jan 18 Javascript
解决vue项目axios每次请求session不一致的问题
Oct 24 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
Jan 25 #Javascript
学习JavaScript事件流和事件处理程序
Jan 25 #Javascript
javascript产生随机数方法汇总
Jan 25 #Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
Jan 25 #Javascript
理解JavaScript表单的基础知识
Jan 25 #Javascript
jquery获取文档高度和窗口高度汇总
Jan 25 #Javascript
JavaScript数组的一些奇葩行为
Jan 25 #Javascript
You might like
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
2019/04/10 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
前台js调用后台方法示例
2013/12/02 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
大型JavaScript应用程序架构设计模式
2016/06/29 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
2018/01/02 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
Python编程实现的简单Web服务器示例
2017/06/22 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
python next()和iter()函数原理解析
2020/02/07 Python
Python 如何测试文件是否存在
2020/07/31 Python
俄罗斯最大的消费电子连锁零售商:Mvideo
2017/06/25 全球购物
英国复古服装和球衣购买网站:3Retro Football
2018/07/09 全球购物
怎样声明子类
2013/07/02 面试题
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
2012/05/30 面试题
服装销售人员求职自我评价
2013/09/26 职场文书
统计学专业毕业生的自我评价分享
2013/11/28 职场文书
大学生活动策划方案
2014/02/10 职场文书
班级文化标语
2014/06/23 职场文书
中学教师教学工作总结
2015/08/13 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL
Python 键盘事件详解
2021/11/11 Python
Python selenium绕过webdriver监测执行javascript
2022/04/12 Python