理解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小知识
Oct 15 Javascript
JavaScript 图像动画的小demo
May 23 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
Jan 24 Javascript
jquery实现excel导出的方法
Apr 04 Javascript
使用jQuery实现input数值增量和减量的方法
Jan 24 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
Oct 08 Javascript
JS获得多个同name 的input输入框的值的实现方法
Jan 09 Javascript
JS多文件上传的实例代码
Jan 11 Javascript
Vue结合后台导入导出Excel问题详解
Feb 19 Javascript
vue基于viewer实现的图片查看器功能
Apr 12 Javascript
JavaScript中变量提升机制示例详解
Dec 27 Javascript
es6函数之尾调用优化实例分析
Apr 25 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
mysql+php分页类(已测)
2008/03/31 PHP
第五章 php数组操作
2011/12/30 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
javascript闭包的高级使用方法实例
2013/07/04 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
移动适配的几种方案(三种方案)
2016/11/25 Javascript
BootstrapTable请求数据时设置超时(timeout)的方法
2017/01/22 Javascript
Bootstrap模态框插件使用详解
2017/05/11 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
Python中的作用域规则详解
2015/01/30 Python
Python THREADING模块中的JOIN()方法深入理解
2015/02/18 Python
Python实现多线程抓取网页功能实例详解
2017/06/08 Python
python difflib模块示例讲解
2017/09/13 Python
Python3简单实例计算同花的概率代码
2017/12/06 Python
Django1.11配合uni-app发起微信支付的实现
2019/10/12 Python
django中间键重定向实例方法
2019/11/10 Python
浅谈tensorflow中张量的提取值和赋值
2020/01/19 Python
Python3+Selenium+Chrome实现自动填写WPS表单
2020/02/12 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
大学毕业生最详细的自我评价分享
2013/11/18 职场文书
幼儿园毕业家长感言
2014/02/10 职场文书
十八届三中全会报告学习材料
2014/02/17 职场文书
小学生评语集锦
2014/04/18 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
考试没考好检讨书
2015/05/06 职场文书
2015年卫生局工作总结
2015/07/24 职场文书
MySQL 数据丢失排查案例
2021/05/08 MySQL
Python+tkinter实现高清图片保存
2022/03/13 Python