学习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 标题的自动翻转实现代码
Oct 14 Javascript
用JavaScript仿PS里的羽化效果代码
Dec 20 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
Apr 23 Javascript
JS排序之冒泡排序详解
Apr 08 Javascript
深入理解react-router@4.0 使用和源码解析
May 23 Javascript
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
Jan 08 Javascript
jQuery实现的模仿雨滴下落动画效果
Dec 11 jQuery
JavaScript使用ul中li标签实现删除效果
Apr 15 Javascript
Vue 动态添加路由及生成菜单的方法示例
Jun 20 Javascript
解决vue-cli输入命令vue ui没效果的问题
Nov 17 Javascript
一文帮你理解PReact10.5.13源码
Apr 03 Javascript
vue+echarts实现多条折线图
Mar 21 Vue.js
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
用PHP实现递归循环每一个目录
2010/08/08 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
js url传值中文乱码之解决之道
2009/11/20 Javascript
jQuery 学习入门篇附实例代码
2010/03/16 Javascript
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
IE与FireFox中的childNodes区别
2011/10/20 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
学习vue.js表单控件绑定操作
2016/12/05 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
2017/01/04 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
深入理解vue $refs的基本用法
2017/07/13 Javascript
JavaScript中Object基础内部方法图
2018/02/05 Javascript
vue-cli3.0如何使用CDN区分开发、生产、预发布环境
2018/11/22 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
关于是否需要写商业计划书
2014/02/07 职场文书
《两个铁球同时着地》教学反思
2014/02/13 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
2014年体育工作总结
2014/11/24 职场文书
公司股份转让协议书范本
2015/01/28 职场文书
党支部工作总结2015
2015/04/01 职场文书
用python画城市轮播地图
2021/05/28 Python
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript