学习JavaScript事件流和事件处理程序


Posted in Javascript onJanuary 25, 2016

本文全篇介绍了JavaScript事件流和事件处理程序,分享给大家供大家参考,具体内容如下

一、事件流

事件流描述的是从页面中接收事件的顺序。IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕获流。

二、事件冒泡

即事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点。如:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
</head>
<body>
 <div>Click</div>
</body>
</html>

当点击了页面中的div元素,那么这个click事件会按照如下顺序传播:

  • div元素
  • body元素
  • html元素
  • document对象

三、事件捕获

事件捕获的思想是最具体的节点应该最后接收到事件。事件捕获的用意在于事件到达目标之前捕获它。

当点击了页面中的div元素,那么这个click事件则会按照如下顺序传播:

  • document对象
  • html标签
  • body标签
  • div标签

虽然规范要求事件应该从document对象开始传播,但浏览器一般都是从window对象开始捕获事件的。因为老版本浏览器不支持,所以一般都使用事件冒泡。

四、DOM事件流

“DOM2级事件”规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段事件冒泡阶段

在DOM事件流中,实际的目标在捕获阶段不会接收事件。就是说在捕获阶段,事件从document到html再到body后就停止了。下一个阶段是“处于目标”阶段,于是事件在div中发生,并在事件处理中被看成是冒泡阶段的一部分。然后,冒泡阶段发生。IE8及更早的版本不支持DOM事件流,浏览器在捕获阶段触发事件对象上的事件,结果就是有两个机会在目标对象上面操作事件。

五、事件处理程序

事件就是用户或浏览器自身执行的某种动作;事件处理程序(或事件侦听器)就是响应某个事件的函数。事件处理程序的名字以“on”开头,如onload、onclick等。

六、HTML事件处理程序

若要在按钮被单击时执行一些js代码,可以这样编写:

<div onclick="alert('Clicked')">Click</div>

注意:不能在其中使用未经转义的HTML语法字符。

也可以调用在页面中其他地方定义的脚本:

<script>
 function showMessage () {
  document.write("fdas");
 }
</script>
<input type="button" value="Click Me" onclick="showMessage()" />

事件处理程序中的代码在执行时,有权访问全局作用域中的任何代码。

这样使用会创建一个封装着的元素属性值的函数。这个函数有一个局部变量event,也就是事件对象:

<input type="button" value="Click Me" onclick="alert(event.type)" />

其中,this值等于事件的目标元素,如:

<input type="button" value="Click Me" onclick="alert(this.value)" />

HTML事件处理程序存在众多问题,所以应该使用js指定的事件处理程序

七、DOM0级事件处理程序

要使用js指定事件处理程序,首先必须取得一个要操作的对象的引用。

每个元素都有自己的事件处理程序属性,这些属性通常全部小写,如onclick。如:

<input type="button" value="Click Me" id="btn" />
<script>
document.querySelector("#btn").onclick = function() {
 console.log("hello");
}
</script>

使用DOM0级方法指定的事件处理程序被认为是元素的方法。因此,这时候的事件处理程序是在元素的作用域中运行的;也就是this引用当前元素:

<input type="button" value="Click Me" id="btn" />
<script>
document.querySelector("#btn").onclick = function() {
 console.log(this.type);
}
</script>

以上述这种方式添加的事件处理程序会在事件流的冒泡阶段被处理。

删除通过DOM0级方法指定的事件处理程序:

btn.onclick = null;

八、DOM2级事件处理程序

addEventListener()

该方法接收三个参数:要处理的事件名、事件处理程序函数和布尔值;布尔值如果是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。如:

var btn = document.getElementById("btn");
btn.addEventListener("click", function () {
 console.log(this.id);
})

还可以为该按钮添加多个事件处理程序,如:

var btn = document.getElementById("btn");
btn.addEventListener("click", function () {
  console.log(this.id);
})
btn.addEventListener("click", function () {
  console.log(this.value);
})

removeEventListener()

var btn = document.getElementById("btn");
function info () {
  console.log(this.value);
}
btn.addEventListener("click", info);
btn.addEventListener("click", function () {
  console.log(this.id);
});
btn.addEventListener("click", function valueAndId () {
  console.log(this.value + " " + this.id);
});
btn.removeEventListener("click", info); //有效
btn.removeEventListener("click", function () {
  console.log(this.id);
}); //无效
btn.removeEventListener("click", valueAndId); //报错无效

大多数情况下,都是将事件处理程序添加到事件流的冒泡阶段,这样就可以最大限度地兼容各种浏览器。

以上就是关于JavaScript事件流和事件处理程序的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
jQuery+jqmodal弹出窗口实现代码分明
Jun 14 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
Oct 18 Javascript
JQuery菜单效果的两个实例讲解(3)
Sep 17 Javascript
跟我学习javascript的定时器
Nov 19 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
Jul 24 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
Dec 02 Javascript
浅谈javascript中的数据类型转换
Dec 27 Javascript
bootstrap fileinput 上传插件的基础使用
Feb 17 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
Jul 17 Javascript
浅谈node中的exports与module.exports的关系
Aug 01 Javascript
es6基础学习之解构赋值
Dec 10 Javascript
vue移动端写的拖拽功能示例代码
Sep 09 Javascript
javascript产生随机数方法汇总
Jan 25 #Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
Jan 25 #Javascript
理解JavaScript表单的基础知识
Jan 25 #Javascript
jquery获取文档高度和窗口高度汇总
Jan 25 #Javascript
JavaScript数组的一些奇葩行为
Jan 25 #Javascript
JavaScript文本框脚本编写的注意事项
Jan 25 #Javascript
详解js私有作用域中创建特权方法
Jan 25 #Javascript
You might like
twig里使用js变量的方法
2016/02/05 PHP
php网页版聊天软件实现代码
2016/08/12 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
2012/05/23 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
appendChild() 或 insertBefore()使用与区别介绍
2013/10/11 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
JS动态修改iframe高度和宽度的方法
2015/04/01 Javascript
JavaScript实现拖拽网页内元素的方法
2015/04/15 Javascript
JavaScript中判断函数、变量是否存在
2015/06/10 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
利用Python开发实现简单的记事本
2016/11/15 Python
Jupyter中直接显示Matplotlib的图形方法
2018/05/24 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
python使用 zip 同时迭代多个序列示例
2019/07/06 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
2019/07/26 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
2020/06/23 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
【HTML5】Canvas绘制简单图片教程
2016/05/13 HTML / CSS
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
手工制作的意大利礼服鞋:Ace Marks
2018/12/15 全球购物
node中使用shell脚本的方法步骤
2021/03/23 Javascript
网站美工岗位职责
2014/04/02 职场文书
小学一年级数学教学计划
2015/01/20 职场文书
大二学年个人总结
2015/03/03 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
使用Django实现商城验证码模块的方法
2021/06/01 Python