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 相关文章推荐
通过Unicode转义序列来加密,按你说的可以算是混淆吧
May 06 Javascript
utf-8编码引起js输出中文乱码的解决办法
Jun 23 Javascript
jquery easyui combobox模糊过滤(示例代码)
Nov 30 Javascript
文本框文本自动补全效果示例分享
Jan 19 Javascript
防止按钮在短时间内被多次点击的方法
Mar 10 Javascript
javascript使用正则表达式实现去掉空格之后的字符
Feb 15 Javascript
Webpack 实现 Node.js 代码热替换
Oct 22 Javascript
JQuery遍历元素的后代和同胞实现方法
Sep 18 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
Dec 13 Javascript
Bootstrap进度条学习使用
Feb 09 Javascript
信息滚动效果的实例讲解
Sep 18 Javascript
vue加载完成后的回调函数方法
Sep 07 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
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
2015/02/03 Javascript
js实现防止被iframe的方法
2015/07/03 Javascript
jQuery.extend 函数及用法详细
2015/09/06 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
vue better scroll 无法滚动的解决方法
2018/06/07 Javascript
vue-cli3 karma单元测试的实现
2019/01/18 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
vue使用原生swiper代码实例
2020/02/05 Javascript
[00:18]天涯墨客三技能展示
2018/08/25 DOTA
跟老齐学Python之通过Python连接数据库
2014/10/28 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
Python基于win32ui模块创建弹出式菜单示例
2018/05/09 Python
python 中字典嵌套列表的方法
2018/07/03 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
HTML5 Canvas 起步(1) - 基本概念
2009/05/12 HTML / CSS
HTML5的download属性详细介绍和使用实例
2014/04/23 HTML / CSS
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
英国的屈臣氏:Boots博姿
2017/12/23 全球购物
设计师珠宝:Ylang 23
2018/05/11 全球购物
.net面试题
2016/09/17 面试题
大型晚会策划方案
2014/02/06 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
股东授权委托书范本
2014/09/13 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
2015年教务工作总结
2015/05/23 职场文书
浅谈Vue的computed计算属性
2022/03/21 Vue.js