关于事件捕获和事件冒泡

  这篇随笔主要是写关于事件冒泡和事件捕获的一些关联,主要是从《JavaScript高级程序设计》这本书第13章总结扩展而来,今天主要是想扩展对书本里面P358页以及加深一下理解。

一、先说一下定义:

  事件冒泡阶段:从最具体的元素,即目标事件位置往文档的根节点方向回溯,从内向外冒泡事件对象(所有浏览器都支持)。

  事件捕获阶段:先由文档的根节点document往事件触发对象,从外向内捕获事件对象(DOM2级事件要求时间从document对象开始传播,但是IE9,Safari,Chrome,Opera,Firefox都是从window对象开始捕获事件的,老版本的浏览器不支持事件捕获)。

  目标阶段:到达被触发的元素。

  事件处理程序是否指定给目标元素怎么看?如果触发的函数直接绑定在目标元素上面的话,那么事件处理程序就是直接指定给目标元素,如下面的代码:

  (1)事件处理程序就是直接指定给目标元素

  <input type="button" value="点击" id="btn">

  var btn = document.getElementById("btn");

  btn.onclick = function(){   //红色部分就是事件处理程序,假设我们此时点击按钮,那么此时事件处理程序直接指定给目标元素id为btn的按钮

    console.log(event.currentTarget === this);   //true,此时this,currentTarget,target的值都相同

    console.log(event.target === this); //true

  }

  (2)事件处理程序就是未直接指定给目标元素  

  <input type="button" value="点击" id="btn">

  var btn = document.getElementById("btn");

  document.body.onclick = function(){   //假设我们此时点击按钮,那么此时事件处理程序是指定给body

    console.log(event.currentTarget === document.body);   //true,此时this,currentTarget,target的值都相同

    console.log(this === document.body); //true

    console.log(event.target === document.getElementById("btn")); //true

  }

二、"DOM2级事件"规定事件流包括三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。首先是事件捕获(此时可以截获事件);然后就是实际的目标接收到事件;最后就是冒泡阶段,可以再这个阶段对事件作出响应。

(此图片来源百度图片)

  接下来就是扩展的问题啦啦啦啦,集中精神。

  1.先单独看一下冒泡和捕获的过程

  (1)冒泡过程:

  代码:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title></title>
 5     <style type="text/css">
 6         *{
 7             font-size: 20px;
 8             color: white;
 9         }
10         #one{
11             width: 400px;
12             height: 400px;
13             background-color: pink;
14         }
15         #two{
16             width: 300px;
17             height: 300px;
18             background-color: green;
19         }
20         #three{
21             width: 200px;
22             height: 200px;
23             background-color: blue;
24         }
25         #four{
26             width: 100px;
27             height: 100px;
28             background-color: black;
29         }
30     </style>
31     <script type="text/javascript">
32         window.onload = function(){
33           var one=document.getElementById(‘one‘);
34           var two=document.getElementById(‘two‘);
35           var three=document.getElementById(‘three‘);
36           var four=document.getElementById(‘four‘);
37           one.addEventListener(‘click‘,function(){
38             console.log(‘one冒泡‘);
39           },false);
40           two.addEventListener(‘click‘,function(){
41             console.log(‘two冒泡‘);
42           },false);
43           three.addEventListener(‘click‘,function(){
44             console.log(‘three冒泡‘);
45           },false);
46           four.addEventListener(‘click‘,function(){
47             console.log(‘four冒泡‘);
48           },false);
49         }
50     </script>
51 </head>
52 <body>
53     <div id=‘one‘>
54         one
55           <div id=‘two‘>
56               two
57             <div id=‘three‘>
58                 three
59                   <div id=‘four‘>
60                       four
61                   </div>
62             </div>
63           </div>
64     </div>
65 </body>
66 </html>

  效果图:

  

  (2)捕获过程:

  代码:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title></title>
 5     <style type="text/css">
 6         *{
 7             font-size: 20px;
 8             color: white;
 9         }
10         #one{
11             width: 400px;
12             height: 400px;
13             background-color: pink;
14         }
15         #two{
16             width: 300px;
17             height: 300px;
18             background-color: green;
19         }
20         #three{
21             width: 200px;
22             height: 200px;
23             background-color: blue;
24         }
25         #four{
26             width: 100px;
27             height: 100px;
28             background-color: black;
29         }
30     </style>
31     <script type="text/javascript">
32         window.onload = function(){
33           var one=document.getElementById(‘one‘);
34           var two=document.getElementById(‘two‘);
35           var three=document.getElementById(‘three‘);
36           var four=document.getElementById(‘four‘);
37           one.addEventListener(‘click‘,function(){
38             console.log(‘one捕获‘);
39           },true);
40           two.addEventListener(‘click‘,function(){
41             console.log(‘two捕获‘);
42           },true);
43           three.addEventListener(‘click‘,function(){
44             console.log(‘three捕获‘);
45           },true);
46           four.addEventListener(‘click‘,function(){
47             console.log(‘four捕获‘);
48           },true);
49         }
50     </script>
51 </head>
52 <body>
53     <div id=‘one‘>
54         one
55           <div id=‘two‘>
56               two
57             <div id=‘three‘>
58                 three
59                   <div id=‘four‘>
60                       four
61                   </div>
62             </div>
63           </div>
64     </div>
65 </body>
66 </html>

  效果图: 

 

  2.既有捕获又有冒泡时的过程:

  代码:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title></title>
 5     <style type="text/css">
 6         *{
 7             font-size: 20px;
 8             color: white;
 9         }
10         #one{
11             width: 400px;
12             height: 400px;
13             background-color: pink;
14         }
15         #two{
16             width: 300px;
17             height: 300px;
18             background-color: green;
19         }
20         #three{
21             width: 200px;
22             height: 200px;
23             background-color: blue;
24         }
25         #four{
26             width: 100px;
27             height: 100px;
28             background-color: black;
29         }
30     </style>
31     <script type="text/javascript">
32         window.onload = function(){
33           var one=document.getElementById(‘one‘);
34           var two=document.getElementById(‘two‘);
35           var three=document.getElementById(‘three‘);
36           var four=document.getElementById(‘four‘);
37           one.addEventListener(‘click‘,function(){
38             console.log(‘one捕获‘);
39           },true);
40           two.addEventListener(‘click‘,function(){
41             console.log(‘two冒泡‘);
42           },false);
43           three.addEventListener(‘click‘,function(){
44             console.log(‘three捕获‘);
45           },true);
46           four.addEventListener(‘click‘,function(){
47             console.log(‘four冒泡‘);
48           },false);
49         }
50     </script>
51 </head>
52 <body>
53     <div id=‘one‘>
54         one
55           <div id=‘two‘>
56               two
57             <div id=‘three‘>
58                 three
59                   <div id=‘four‘>
60                       four
61                   </div>
62             </div>
63           </div>
64     </div>
65 </body>
66 </html>

  效果图:

  

  3.如果一个元素同时绑定了两个事件,既有冒泡事件,又有捕获事件时,应该执行几次,先后顺序是什么?

  (1)绑定多少个事件就执行多少次事件。

  (2)执行顺序问题:

  【1】如果多次绑定事件的元素是目标元素,那么执行时就按照绑定的顺序执行(注意:这里说的按照绑定顺序执行是指利用addEventListener来绑定事件的;如果是利用attachEvent来绑定事件的,就是以绑定时的相反顺序执行),其他元素就按照先捕获后冒泡的顺序执行。

  代码:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title></title>
 5     <style type="text/css">
 6         *{
 7             font-size: 20px;
 8             color: white;
 9         }
10         #one{
11             width: 400px;
12             height: 400px;
13             background-color: pink;
14         }
15         #two{
16             width: 300px;
17             height: 300px;
18             background-color: green;
19         }
20         #three{
21             width: 200px;
22             height: 200px;
23             background-color: blue;
24         }
25         #four{
26             width: 100px;
27             height: 100px;
28             background-color: black;
29         }
30     </style>
31     <script type="text/javascript">
32         window.onload = function(){
33           var one=document.getElementById(‘one‘);
34           var two=document.getElementById(‘two‘);
35           var three=document.getElementById(‘three‘);
36           var four=document.getElementById(‘four‘);
37           one.addEventListener(‘click‘,function(){
38             console.log(‘one捕获‘);
39           },true);
40           two.addEventListener(‘click‘,function(){
41             console.log(‘two冒泡‘);
42           },false);
43           three.addEventListener(‘click‘,function(){
44             console.log(‘three冒泡‘);
45           },false);
46           three.addEventListener(‘click‘,function(){
47             console.log(‘three捕获‘);
48           },true);
49           four.addEventListener(‘click‘,function(){
50             console.log(‘four冒泡‘);
51           },false);
52         }
53     </script>
54 </head>
55 <body>
56     <div id=‘one‘>
57         one
58           <div id=‘two‘>
59               two
60             <div id=‘three‘>
61                 three
62                   <div id=‘four‘>
63                       four
64                   </div>
65             </div>
66           </div>
67     </div>
68 </body>
69 </html>

  

  【2】如果多次绑定事件的元素没有被触发,而是触发其他元素,那么多次绑定的元素的事件的执行顺序就是按照"DOM2级事件"规定的那样,先捕获,后目标元素,最后冒泡。

  代码同【1】中代码一样,只是这次是触发id为four这个div,效果图如下:

  

  OK,大概的扩展和进一步的理解就到这里,加油,在变得越来越优秀的路上,哈哈。

  

时间: 2024-08-26 00:47:13

关于事件捕获和事件冒泡的相关文章

javascript中的事件冒泡、事件捕获和事件执行顺序

谈起JavaScript的 事件,事件冒泡.事件捕获.阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免. DOM事件标准定义了两种事件流,这两种事件流有着显著的不同并且可能对你的应用有着相当大的影响.这两种事件流分别是捕获和冒泡.和许多Web技术一样,在它们成为标准之前,Netscape和微软各自不同地实现了它们.Netscape选择实现了捕获事件流,微软则实现了冒泡事件流.幸运的是,W3C决定组合使用这两种方法,并且大多数新浏览器都遵循这两种事件流方式. 1事件传播--冒泡与捕

javascript的事件捕获和事件冒泡

W3C规范对于脚本事件有两种处理方式,第一种为冒泡模型,第二种是事件捕获模型,前者为早期浏览器所支持的(也称DOM 0标准),后者为W3C规范推荐的方法(也称DMO 2标准). 其主要区别: @1:事件捕获不依赖于特定的事件来处理属性 @2:你可以对任何对象的任何一种事件注册多个事件句柄函数 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> &

JS中的事件绑定,事件捕获,事件冒泡以及事件委托,兼容IE

转载请注明出处:http://www.cnblogs.com/zhangmingze/p/4864367.html ● 事件分为三个阶段:   事件捕获 -->  事件目标 -->  事件冒泡 ● 事件捕获:事件发生时(onclick,onmouseover--)首先发生在document上,然后依次传递给body.……最后到达目的节点(即事件目标). ● 事件冒泡:事件到达事件目标之后不会结束,会逐层向上冒泡,直至document对象,跟事件捕获相反 1.onlick -->事件冒泡,

javascript -- 事件捕获,事件冒泡

使用js的时候,当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,单击子元素时,父元素的onclick事件也会被触发.js里称这种事件连续发生的机制为事件冒泡或者事件捕获. 为什么会有事件冒泡,又有捕获呢?应为当初IE浏览器和Natscape浏览器分别对自己浏览器的事件采用了不同的发生机制,IE浏览器采用了冒泡型:定义有相同事件的嵌套元素,当事件被触发时,子元素拥有优先权,即从里向外发生,像水里的泡泡一样从里向外冒.而Netscape采用了相反的做法,即捕获型,父元素拥有优先权

DOM事件阶段以及事件捕获与事件冒泡先后执行顺序

平时浏览这么多技术文章,如过不去实践.深入弄透它,这个技术点很快就会在脑海里模糊.要加深印象,就得好好过一遍.重要的事情说三遍,重要的知识写一遍. 开发过程中我们都希望使用别人成熟的框架,因为站在巨人的肩膀上会使得我们开发的效率大幅度提升.不过,我们也应该.必须了解其基本原理.比如DOM事件,jquery框架帮我们为我们封装和抽象了各浏览器的差异行为,为事件处理带来了极大的便利.不过浏览器逐步走向统一和标准化,我们可以更加安全地使用官方规范的接口.因为只有获得众多开发者的芳心,浏览器才会走得更远

js事件捕获,事件冒泡,事件委托以及DOM事件流

一:DOM事件流: 事件流是从页面接收事件的顺序,DOM2级事件规定事件流包括三个阶段: ①事件捕获阶段:用意在于事件达到目标之前捕获它,在事件捕获阶段事件流模型:document→html→body→div ②处于目标阶段2:实际的目标到事件 ③事件冒泡阶段:由最具体的元素接收到事件,然后向上传播到较为不具体的节点.事件流模型:div →body→ html→ document 二:事件委托 事件委托顾名思义:将事件委托给另外的元素.其实就是利用DOM的事件冒泡原理,将事件绑定到目标元素的父节

事件绑定,事件捕获,事件冒泡以及事件委托,兼容IE

● 事件分为三个阶段:   事件捕获 -->  事件目标 -->  事件冒泡 ● 事件捕获:事件发生时(onclick,onmouseover--)首先发生在document上,然后依次传递给body.……最后到达目的节点(即事件目标). ● 事件冒泡:事件到达事件目标之后不会结束,会逐层向上冒泡,直至document对象,跟事件捕获相反 1.onlick -->事件冒泡,重写onlick会覆盖之前属性,没有兼容性问题 ele.onclik = null; //解绑单击事件,将onlic

DOM事件机制(事件捕获和事件冒泡和事件委托)

内容: 1.事件复习 2.事件冒泡与事件捕获 3.事件委托 1.事件复习 (1)事件 事件是用来处理响应的一个机制,这个响应可以来自于用户(点击, 鼠标移动, 滚动), 也可以来自于浏览器 下面的链接描述了所有事件:https://developer.mozilla.org/en-US/docs/Web/Events (2)事件绑定 事件绑定有3种方法,前两钟方法在这里不介绍,主要看第三种: addEventListener方法(使用事件监听绑定事件) addEventListener: 1 e

事件捕获和事件冒泡理解

之前总是单纯的记得事件冒泡和事件捕获相反,一个从下至上,另一个从上至下,但是却没有弄明白他们的执行顺序,导致昨晚笔试CVTE出了类似这么一道题不会做. 对于DOM和DOM2级事件这两个区别就不详细解释了,网上大把资料. 这里仅针对该题目进行事件捕获和事件冒泡顺序进行理解. 首先要明白DOM2级事件规定的事件流包含3个阶段,事件捕获阶段.处于目标阶段.事件冒泡阶段. 下面贴题目代码(仅核心部分)进行详细解释,首先 addEventListener方法有三个参数,分别是事件监听类型,事件执行函数和是