理解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 相关文章推荐
jquery实现控制表格行高亮实例
Jun 05 Javascript
利用jquery写的左右轮播图特效
Feb 12 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
Jun 06 Javascript
JS不能跨域借助jquery获取IP地址的方法
Aug 20 Javascript
一个JavaScript操作元素定位元素的实例
Oct 29 Javascript
JavaScript DOM基础
Apr 13 Javascript
javascript实现别踩白块儿小游戏程序
Nov 22 Javascript
在AngularJS框架中处理数据建模的方式解析
Mar 05 Javascript
Vue 自定义指令功能完整实例
Sep 17 Javascript
JS实现简单的表格增删
Jan 16 Javascript
js实现特别简单的钟表效果
Sep 14 Javascript
Vue图片裁剪组件实例代码
Jul 02 Vue.js
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
在PHP中实现Javascript的escape()函数代码
2010/08/08 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
php写入mysql中文乱码的实例解决方法
2019/09/17 PHP
优秀js开源框架-jQuery使用手册(1)
2007/03/10 Javascript
javascript indexOf函数使用说明
2008/07/03 Javascript
jquery根据name属性查找的小例子
2013/11/21 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
javascript几个易错点记录
2014/11/26 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
Python写入数据到MP3文件中的方法
2015/07/10 Python
Python实现一个服务器监听多个客户端请求
2018/04/12 Python
python复制文件到指定目录的实例
2018/04/27 Python
Python面向对象程序设计示例小结
2019/01/30 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
2019/09/11 Python
HTML5中新标签和常用标签详解
2014/03/07 HTML / CSS
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
印尼旅游网站:via
2017/11/12 全球购物
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
2013/03/30 面试题
通息工程毕业生自荐信
2013/10/16 职场文书
新闻发布会主持词
2014/03/28 职场文书
岗位竞聘书范文
2014/03/31 职场文书
数学备课组工作总结
2015/08/12 职场文书
SQLServer2019 数据库的基本使用之图形化界面操作的实现
2021/04/08 SQL Server
python opencv通过4坐标剪裁图片
2021/06/05 Python
总结一些Java常用的加密算法
2021/06/11 Java/Android
bose降噪耳机音能消除人声吗
2022/04/19 数码科技
python热力图实现的完整实例
2022/06/25 Python