JavaScript 进阶教程一 JavaScript 中的事件流 - 事件冒泡和事件捕获
先看下面的示例代码:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>JavaScript 中的事件冒泡与事件捕获</title>
</head>
<body>
<div id="Red" style="width:200px;height:200px;background-color:red;padding:20px;">
<div id="Bule" style="width:160px;height:160px;background-color:blue;padding:20px;">
<div id="Yellow" style="width:120px;height:120px;margin:auto;background-color:yellow;padding:20px;">
<div id="Green" style="width:80px;height:80px;margin:auto;background-color:green;padding:20px;"></div>
</div>
</div>
</div>
</body>
</html>
效果如下图所示:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQEAAAD7CAIAAADl8LZhAAADzElEQVR4nO3TMY4bQRAEwX26fk69QM4VRLIvo5FuATNGPC/n2vd8+gHOffgYcPVjwNWPAVe/fxt4Hun3xIDqMaB6DKgeA6rHgOoxoHoMqB4DqseA6jGgegyoHgOqx4DqMaB6DKgeA6rHgOoxoHoMqN6bDXz8v/qVbWMGdL9tzIDut40Z0P22MQO63zZmQPfbxgzoftuYAd1vGzOg+21jBnS/bcyA7reNGdD9tjEDut82ZkD328YM6H7bmAHdbxszoPttYwZ0v23MgO63jRnQ/bbxHQOv16NfHAMM1GOAgXoMMFCPAQbqMcBAPQYYqMcAA/UYYKAeAwzUY4CBegwwUI8BBuoxwEA9BhioxwAD9RhgoB4DDNRjgIF6DDBQj4H/a+D5o3fEAAP1GGCgHgMM1GOAgXoMMFCPAQbqMcBAPQYYqMcAA/UYYKAeAwzUY4CBegwwUI8BBuoxwEA9BhioxwAD9RhgoB4DDNRjgIF6DDBQjwEG6jHAQD0GGKjHAAP1GGCgHgMM1GOAgXoMMFCPAQbqMcBAPQYYqMcAA/UYYKAeAwzUY4CBegwwUI8BBuoxwEA9BhioxwAD9RhgoB4DDNRjgIF6DDBQjwEG6jHAQD0GGKjHAAP1GGCgHgMM1GOAgXoMMFCPAQbqMcBAPQYYqMcAA/UYYKAeAwzUY4CBegwwUI8BBuoxwEA9BhioxwAD9RhgoB4DDNRjgIF6DDBQjwEG6jHAQD0GGKjHAAP1GGCgHgMM1GOAgXoMMFCPAQbqMcBAPQYYqMcAA/UYYKAeAwzUY4CBegwwUI8BBuoxwEA9BhioxwAD9RhgoB4DDNRjgIF6DDBQjwEG6jHAQD0GGKjHAAP1GGCgHgMM1GOAgXoMMFCPAQbqMcBAPQYYqMcAA/UYYKAeAwzUY4CBegwwUI8BBuoxwEA9BhioxwAD9RhgoB4DDNRjgIF6DDBQjwEG6jHAQD0GvteAvj8GGKjHAAP1GGCgHgMM1GOAgXoMMFCPAQbqMcBAPQYYqMcAA/UYYKAeAwzUY4CBegwwUI8BBuoxwEA9BhioxwAD9RhgoB4D0s/bxgzoftuYAd1vGzOg+21jBnS/bcyA7reNGdD9tjEDut82ZkD328YM6H7bmAHdbxszoPttYwZ0v23MgO63jRnQ/bYxA7rfNmZA99vGDOh+25gB3W8bM6D7beP3GpC+LgZUjwHVY0D1GFA9BlSPAdVjQPUYUD0GVI8B1WNA9RhQPQZUjwHVY0D1GFA9BlSPAdVjQPV+YsC5xjHg6seAqx8Drn4MuPox4Or3FzMgflDKJklaAAAAAElFTkSuQmCC" alt="" />
考虑这种情况,我们用鼠标点击最中间的 绿色,触发了绿块DIV的点击事件,那是不是也触发了它的父级 黄色块的点击事件,以及祖先级别的 蓝色以及红色块的点击事件?
早期的浏览器开发商网景以及微软一致的认为该点击事件确实触发了父级和祖先级别的点击事件!!!
一、事件流
事件流描述的是从页面中接收事件的顺序,虽然IE以及Netscape都承认事件流的存在,但是却提出了差不错完全相反的事件流概念。IE的事件流是 事件冒泡流,而Netscape的事件流是 事件捕获流。
二、事件冒泡流
事件冒泡流的意思就是事件会从最开始触发的那个元素开始,一级级的向上传播并触发祖先级别对应的事件,直至Document 对象为止。
因此如果我们点击图中的绿色块 click 事件发生的顺序应该是 Green -> Yellow -> Blue -> Red -> body -> html -> document。
三、事件捕获流
事件捕获流与事件冒泡流相反,事件会从最外层开始触发,直至最具体的元素为止。
因此如果我们点击图中的绿色块 click 事件发生的顺序应该是 document -> html -> body -> Red -> Blue -> Yellow -> Green。
四、事件流的实现
W3C的 “DOM2级事件” 中规定的事件流同时支持了事件捕获阶段和事件冒泡阶段。我们可以使用 “DOM2级事件” 提供的两个方法 addEventListener()和 removeEventListener() 来为一个特定的元素绑定或者删除一个事件处理函数:
element.addEventListener(event, function, useCapture)
element.removeEventListener(event, function, useCapture)
event : 要处理的事件名
function:事件处理程序的函数
useCapture:布尔值 指定使用哪种事件流。false 采用事件冒泡流,true 采用事件捕获流。
请看以下 JavaScript 代码:
<script type ="text/javascript">
var div = document.getElementsByTagName("div");
for (var i = 0; i < div.length; i++)
{
div[i].addEventListener("click", showColor, false); // false 代表冒泡事件流, true 代表捕获事件流
} function showColor()
{
alert("触发的DIV的颜色是: " + this.id);
}
</script>
点击最里面的绿色块
当 addEventListener(event, function, useCapture) 的 useCapture 参数为 false 时,依次弹出 Green Yellow Blue Red。
当 addEventListener(event, function, useCapture) 的 useCapture 参数为 true时,依次弹出 Red Blue Yellow Green。
题外记:
今天试了另外一段 JS 代码:
<script type ="text/javascript">
var div = document.getElementsByTagName("div");
for (var i = 0; i < div.length; i++)
{
var useCapture = true;
if (i%2==0)
useCapture = false;
div[i].addEventListener("click", showColor, useCapture); // false 代表冒泡事件流, true 代表捕获事件流
} function showColor()
{
alert("触发的DIV的颜色是: " + this.id);
}
</script>
注意我加粗加红的那段代码,分别给几个div设置了不同的 useCapture.
再次点击绿色块Green时,依次弹出的是 Blue Green Yellow Red.
是因为我们给 Blue块和Green块设置的 useCapture 的值为true 即 事件捕获. Yellow块和Red块依然是 false 即 冒泡事件.
当我们点击绿色块Green时,会先找其祖先级别元素中采用 事件捕获 的元素,一直捕获到当前的元素,然后接着冒泡,但会跳过 事件捕获 的元素,一直到document.
总结起来就一句话: 任何发生在 W3C “DOM2级事件” 中的事件,首是进入捕获阶段,直到达到目标元素,再进入冒泡阶段。
JavaScript 进阶教程一 JavaScript 中的事件流 - 事件冒泡和事件捕获的更多相关文章
- JS Event事件流(冒泡机制、捕获机制、事件绑定)
1.事件流 事件流:从页面中接收事件的顺序.也就是说当一个事件产生时,这个事件的传播过程,就是事件流. IE的事件流 IE中的事件流叫事件冒泡:事件冒泡:事件开始时由最具体的元素接收,然后逐级向上传播 ...
- WPF教程六:理解WPF中的隧道路由和冒泡路由事件
WPF中使用路由事件升级了传统应用开发中的事件,在WPF中使用路由事件能更好的处理事件相关的逻辑,我们从这篇开始整理事件的用法和什么是直接路由,什么是冒泡路由,以及什么是隧道路由. 事件最基本的用法 ...
- js事件流机制冒泡和捕获
JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间. 事件流 从页面中接收事件的顺序称为事件流. IE --> 事件冒泡流 Netsc ...
- python 全栈开发,Day55(jQuery的位置信息,JS的事件流的概念(重点),事件对象,jQuery的事件绑定和解绑,事件委托(事件代理))
一.jQuery的位置信息 jQuery的位置信息跟JS的client系列.offset系列.scroll系列封装好的一些简便api. 一.宽度和高度 获取宽度 .width() 描述:为匹配的元素集 ...
- 关于DOM事件流、DOM0级事件与DOM2级事件
一.DOM 事件模型 DOM 事件模型包括捕获和冒泡,捕获是从上往下到达目标元素,冒泡是从当前元素,也就是目标元素往上到 window 二.流 流的概念,在现今的 JavaScript 中随处可见.比 ...
- 【事件流】浅谈事件冒泡&&事件捕获------【巷子】
首先在扯淡的时候我们需要先了解一个东西,这个东西就是事件流. 1.什么是事件流? 解释:当一个HTML元素触发一个事件处理函数的时候,该事件会在该元素节点到根节点之间传播,传播路径所经过的节点都会接受 ...
- 在javascript中的浏览器兼容问题以及兼容浏览器汇总(默认事件,阻止冒泡,事件监听。。。)以及解决方式详解
在javascript中常见的浏览器兼容问题,以及解决方式. 在前端工作当中我们遵循这样的原则:渐进增强和优雅降级 渐进增强(progressive enhancement): 针对低版本浏览器进 ...
- [已转移]IE事件流和DOM标准事件流的区别
该文章已转移到博客:https://cynthia0329.github.io/ 1.执行的顺序不一样 冒泡型事件模型: button->div->body (IE事件流) 捕获型事件模型 ...
- Dom事件流、冒泡、捕获
Dom事件流 dom的结构是一个倒立的树状结构.当一个html元素触发事件时,事件会在dom的根节点和触发事件的元素节点之间传播,中间的节点都会收到该事件. 捕获:div元素触发事件时,事件先从根节点 ...
随机推荐
- Servlet 获取 ApplicationContext
一般使用Spring完成了注入,在Service或SpringMVC 中可以通过注解的形式来获取 Spring的已经注入的Spring的bean如下所示: @Resource(name = " ...
- Python基础4- 字符串
Python字符串是由数字.字母.下划线组成的一串字符,我们可以使用引号来创建字符串.如:str = 'Helloworld'在Python中没有char类型,单个字符也作为string使用; Pyt ...
- while的使用
我在用while的时候, while(当这个对象的首个字是汉字){ 执行语句 } 我发现出现死循环的现象 其实我要再添加一个条件,就是不管是不是上述条件都成立,最终还是要结束的.
- EF框架step by step(3)—Code-First
CodeFirst是EF框架的第三种方式,也是最为复杂一种方式,本文将以EF4.1版本为基础,简要讲解一下用法,同时,也介绍DbContext的用法. 本文采用的示例仍然是前两篇采用的博客用户的示例. ...
- Oracle查询每天固定时间段的数据
select * from GPS_LOG t where to_char(t.gps_time,'hh24:mm:ss')>='15:30:00'and to_char(t.gps_time, ...
- HDU5735 : Born Slippy
考虑DP,设$f[x]$表示最后一个是$x$时的最优解,则$f[x]=\max(f[y]+w[x]\ opt\ w[y])$,其中$y$是$x$的祖先. 注意到$w[i]<2^{16}$,那么将 ...
- JStorm之Nimbus简介
本文导读: ——JStorm之Nimbus简介 .简介 .系统框架与原理 .实现逻辑和代码剖析 )Nimbus启动 )Topology提交 )任务调度 )任务监控 .结束语 .参考文献 附:JStor ...
- Extjs 属性控件[转载]
Ext.form.TimeField: 配置项: maxValue:列表中允许的最大时间 maxText:当时间大于最大值时的错误提示信息 ...
- JS实现屏蔽键盘操作
第一种:当页面初始加载的时候,屏蔽掉当前页面所有的键盘 $(document).ready(function () { document.body.onkeydown = function (even ...
- 【BZOJ】3211: 花神游历各国
题意 \(n\)个点,第\(i\)个点值为\(a_i\).\(m\)个询问,每次询问\([l, r]\)内的和或者将\([l, r]\)的每个值改为自己的算术平方根.(\(n \le 100000, ...