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元素触发事件时,事件先从根节点 ...
随机推荐
- MapReduce应用案例--简单的数据去重
1. 设计思路 去重,重点就是无论某个数据在文件中出现多少次,最后只是输出一次就可以. 根据这一点,我们联想到在reduce阶段数据输入形式是 <key, value list>,只要是k ...
- 《HBase实战》
对,我正在研读这本书,今天开始,我希望我看完后能有收获和大家分享,这个日志作为开始,勉励自己! 对,我应该静下心,做一些我更喜欢的事情,不能在自我陶醉中迷失! 断断续的看,到今天大概把这本书看完了,没 ...
- C#生成PDF文档,读取TXT文件内容
using System.IO;using iTextSharp.text;using iTextSharp.text.pdf; //需要在项目里引用ICSharpCode.SharpZipLib.d ...
- debug note-- nginx php-fpm : Error:The page you are looking for is temporarily unavailable.
1.在ubuntu下安装配置nginx, mysql, php 安装步骤: 参考:https://www.digitalocean.com/community/tutorials/how-to-ins ...
- hihoCoder#1384 : Genius ACM
对于一个固定的区间$[l,r]$,显然只要将里面的数字从小到大排序后将最小的$m$个和最大的$m$个配对即可. 如果固定左端点,那么随着右端点的右移,$SPD$值单调不降,所以尽量把右端点往右移,贪心 ...
- [R语言]forecast.Arima中使用xreg报错
问题: 使用forecast.Arima对带xreg的arima模型进行预测,报xreg Error pre.m4x <- forecast.Arima(m4x, h = 20, xreg = ...
- hdu1251 统计难题 字典树
Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己 ...
- 使用TCMalloc优化OpenResty
1.安装依赖包 yum -y install wget gcc gcc-c++ -y 2.安装libunwind库可以从http://ftp.twaren.net/Unix/NonGNU//libun ...
- Codeforces Round #253 (Div. 2) A. Anton and Letters
题目很简单,只需要注意带空格的输入用getline即可 #include <iostream> #include <vector> #include <algorithm ...
- ACM:HDU 2199 Can you solve this equation? 解题报告 -二分、三分
Can you solve this equation? Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Su ...