JavaScript事件 "事件对象"的注意要点


Posted in Javascript onJanuary 14, 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,在那里事件才能得到处理。

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;
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()来取消其默认行为。

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、如果是捕获阶段则等于1;
2、如果是目标对象阶段则等于2;
3、如果是冒泡阶段则等于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 相关文章推荐
JqueryMobile动态生成listView并实现刷新的两种方法
Mar 05 Javascript
jQuery实现360°全景拖动展示
Mar 18 Javascript
js控制div弹出层实现方法
May 11 Javascript
JSON+Jquery省市区三级联动
Jan 13 Javascript
JavaScript实现图片滑动切换的代码示例分享
Mar 06 Javascript
详解JavaScript权威指南之对象
Sep 27 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
Dec 01 Javascript
详解基于webpack和vue.js搭建开发环境
Apr 05 Javascript
JQuery 获取Dom元素的实例讲解
Jul 08 jQuery
jQuery实现的简单动态添加、删除表格功能示例
Sep 21 jQuery
微信小程序支付PHP代码
Aug 23 Javascript
原生js实现弹窗消息动画
Nov 20 Javascript
详解JavaScript中localStorage使用要点
Jan 13 #Javascript
javascript图片切换综合实例(循环切换、顺序切换)
Jan 13 #Javascript
jquery悬浮提示框完整实例
Jan 13 #Javascript
js和jquery实现监听键盘事件示例代码
Jun 24 #Javascript
jQuery简单操作cookie的插件实例
Jan 13 #Javascript
AngularJS单选框及多选框实现双向动态绑定
Jan 13 #Javascript
javascript中的作用域和闭包详解
Jan 13 #Javascript
You might like
德生PL660的电路分析和打磨
2021/03/02 无线电
php xml文件操作实现代码(二)
2009/03/20 PHP
php echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
php异常处理技术,顶级异常处理器
2012/06/13 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
PHP查询快递信息的方法
2015/03/07 PHP
PHP cURL初始化和执行方法入门级代码
2015/05/28 PHP
php把数组值转换成键的方法
2015/07/13 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
php基于curl重写file_get_contents函数实例
2016/11/08 PHP
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
常用的js方法合集
2017/03/10 Javascript
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
JS兼容所有浏览器的DOMContentLoaded事件
2018/01/12 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
Angular 利用路由跳转到指定页面的指定位置方法
2018/08/31 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
详解在React-Native中持久化redux数据
2019/05/22 Javascript
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
python实现将文本转换成语音的方法
2015/05/28 Python
Python获取运行目录与当前脚本目录的方法
2015/06/01 Python
不要用强制方法杀掉python线程
2017/02/26 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
Python 动态导入对象,importlib.import_module()的使用方法
2019/08/28 Python
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
英国定做窗帘和纺织品面料一站式商店:Dekoria
2018/08/29 全球购物
大学生职业规划前言模板
2013/12/27 职场文书
试用期员工考核制度
2014/01/22 职场文书
报告会主持词
2014/04/02 职场文书
励志演讲稿300字
2014/08/21 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python