JS中的事件冒泡(Bubble)和事件捕获(capture)以及如何阻止事件的冒泡

对“捕获”和“冒泡”这两个概念,通常我们对冒泡了解和使用的会更多一些,因为在我们使用的所有浏览器中,都支持事件冒泡 ,即事件由子元素向祖先元素传播的,就 像气泡从水底向水面上浮一样。而在像firefox,chrome,safari这类所谓的标准浏览器中,事件传播通常是有三个阶段的:事件捕获阶段,事 件目标阶段,事件冒泡阶段,这三者的执行的顺序是先捕获在冒泡。对于捕获阶段,这个很少 有用武之地,所以被人疏忽遗忘也在所难免了,不常用不代表它不存在,本着科学严谨的态度,我们有必要去看一下它的庐山真面目。

  事件冒泡:事 件冒泡指的是当前的目标元素触发事件的发生,事件在一次向祖先元素传播,在祖先元素上触发相同类型的事件。当子元素都有同一事件处理程序时,利用事件的冒 泡可以减少代码的冗余度。通过给元素对象绑定事件的方法addEventlistener()第三个参数决定事件的执行阶段是在冒泡阶段还是捕获阶段,当 第三个参数为true时,为冒泡阶段,通常省略该参数是默认的是冒泡,如果为false则是捕获阶段。为了兼容IE8以及IE8之前版本浏览器可以通过 attachEvent()方法给元素添加事件不过他没有第三个参数。下面的例子是没有阻止事件冒泡时的代码,最终会看到,当点击了ele2时,事件会向 上冒泡依次输出ele2,ele,ele0,这个就是由于事件的冒泡引起的。

 1 <html>
 2 <head>
 3 <meta charset="utf-8">
 4     <title>bubble event</title>
 5   <style>
 6    .ele0{
 7          width:400px;
 8          height:400px;
 9          border:1px solid black;
10          background-color:red;
11          position:relative;
12     }
13   .ele1{
14      width:300px;
15     height:300px;
16     border:1px ;
17     background-color:green;
18    position:absolute;
19 top:0;
20 }
21 .ele2{
22      width:200px;
23     height:200px;
24     border:1px ;
25     background-color:blue;
26    position:absolute;
27 top:0;
28 }
29 </style>
30 <script>
31   window.onload=function(){
32         var ele=document.getElementsByTagName("div");
33
34             if(ele[0].addEventListener)
35             {
36              ele[0].addEventListener("click", function (){
37
38                 console.log("点击的是盒子ele0!");
39              });
40             }
41
42           else{
43              ele[0].attachEvent("onclick",function (){
44                 console.log("点击的是盒子ele0!");
45
46           });
47           }
48          if(ele[1].addEventListener)
49             {
50              ele[1].addEventListener("click", function (){
51
52                 console.log("点击的是盒子ele1!");
53              });
54             }
55
56           else{
57              ele[1].attachEvent("onclick",function (){
58                 console.log("点击的是盒子ele1!");
59
60           });
61           }
62
63          if(ele[2].addEventListener)
64             {
65              ele[2].addEventListener("click", function (){
66
67                 console.log("点击的是盒子ele2!");
68              });
69             }
70
71           else{
72              ele[2].attachEvent("onclick",function (){
73                 console.log("点击的是盒子ele2!");
74
75           });
76           }
77
78   }
79 </script>
80 </head>
81 <body>
82 <div  class="ele0">
83 <div class="ele1"><div class="ele2"></div></div>
84
85 </div>
86 </body>
87 <html>

  事件捕获:事 件捕获过程与事件的冒泡阶段是一个相反的阶段,即事件由祖先元素向子元素传播,和一个石子儿从水面向水底下沉一样,要说明的是在 IE,opera浏览器中,是不存在这个阶段的。在上述的代码中给事件监听程序添加第三个参数false,当点击元素ele2时会看到不一样的效果,输出 结果中将会最先输出ele0,而不是ele2,这就是事件的捕获。

阻止事件的冒泡:

有时候事件的冒泡回会导致程序的运行顺序和自己想象的情形不一样,这时候就需要对事件的冒泡进行阻止。阻止事件的冒泡的方法与事件处理程序的添加方式有关:

1.如果事件是在HTML中通过属性或者是元素对象的属性添加的即 onclick="function(){}"或者ele.onclick=function(){}方式。要阻止事件的冒泡只需要在处理程序的最后加上return false;即可。

2. 在IE8以上的版本以及其他的浏览器中通过e.stopPropagation()方式阻止事件的冒泡。在 支持该方法的浏览器中还有一个方法stopimmediatePropagation(),该方法不仅会组织事件向祖元素的冒泡,同时也会阻止同一个节点 上同一事件的其他的事件处理程序的执行,该方法比前者阻止的更彻底。

3.在IE8以及IE以下的浏览器中通过e.cancleBubble=true,阻止事件冒泡。

 1 <html>
 2 <head>
 3 <meta charset="utf-8">
 4     <title>bubble event</title>
 5   <style>
 6    .ele0{
 7          width:400px;
 8          height:400px;
 9          border:1px solid black;
10          background-color:red;
11          position:relative;
12     }
13   .ele1{
14      width:300px;
15     height:300px;
16     border:1px ;
17     background-color:green;
18    position:absolute;
19 top:0;
20 }
21 .ele2{
22      width:200px;
23     height:200px;
24     border:1px ;
25     background-color:blue;
26    position:absolute;
27 top:0;
28 }
29 </style>
30 <script>
31   window.onload=function(){
32         var ele=document.getElementsByTagName("div");
33
34             if(ele[0].addEventListener)
35             {
36              ele[0].addEventListener("click", function (e){
37
38                 console.log("点击的是盒子ele0!");
39                 e.stopPropagation();
40              });
41
42             }
43
44           else{
45              ele[0].attachEvent("onclick",function (e){
46                 console.log("点击的是盒子ele0!");
47                 e=window.event;
48                 e.cancleBubble=true;
49
50           });
51           }
52          if(ele[1].addEventListener)
53             {
54              ele[1].addEventListener("click", function (e){
55
56                 console.log("点击的是盒子ele1!");
57                 e.stopPropagation();
58              });
59             }
60
61           else{
62              ele[1].attachEvent("onclick",function (e){
63                 console.log("点击的是盒子ele1!");
64                 e=window.event;
65                 e.cancleBubble=true;
66
67           });
68           }
69
70          if(ele[2].addEventListener)
71             {
72              ele[2].addEventListener("click", function (e){
73
74                 console.log("点击的是盒子ele2!");
75                 e.stopPropagation();
76              });
77             }
78
79           else{
80              ele[2].attachEvent("onclick",function (e){
81                 console.log("点击的是盒子ele2!");
82                 e=window.event;
83                 e.cancleBubble=true;
84
85           });
86           }
87
88   }
89 </script>
90 </head>
91 <body>
92 <div  class="ele0">
93 <div class="ele1"><div class="ele2"></div></div>
94
95 </div>
96 </body>
97 <html>
时间: 2024-08-27 08:21:13

JS中的事件冒泡(Bubble)和事件捕获(capture)以及如何阻止事件的冒泡的相关文章

JS中的函数、Bom、DOM及JS事件

本期博主给大家带来JS的函数.Bom.DOM操作,以及JS各种常用的数据类型的相关知识,同时,这也是JavaScript极其重要的部分,博主将详细介绍各种属性的用法和方法. 一.JS中的函数 [函数的声明及调用] 1.函数声明的格式: function 函数名(参数1,参数2,参数3,--){//函数体 return 结果; } >>>函数的调用格式: 直接调用:函数调用的格式:函数名(参数一的值,参数二的值,--): 事件调用:事件名=函数名( ); 2.函数声明的几点强调: ①函数名

JS中的DOM操作和事件

[DOM树节点] DOM节点分为三大类: 元素节点. 属性节点. 文本节点: 文本节点.属性节点属于元素节点的子节点.操作时,均需要先取到元素节点,再操作子节点: 可以使用getElement系列方法,取到元素节点. [查看元素节点] 1.getElementById:通过id取到唯一节点.如果ID重名,只能取到第一个. getElementsByName(): 通过name属性   getElementsByTagName(): 通过标签名   getElementsByClassName()

从零开始的JS生活(二)——BOM、DOM与JS中的事件

上回书说道,JS中变量.运算符.分支结构.循环和嵌套循环等内容.本回就由本K给大伙唠唠JS中的BOM.DOM和事件. 一."花心大萝卜"--BOM 1.震惊,FFF团为何对BOM举起了火把--BOM简介 BOM(Browser Object Model) 是指浏览器对象模型,在JS中BOM是个不折不扣的花心大萝卜,因为它有很多个对象,其中代表浏览器窗口的Window对象是BOM的"正室".也就是最重要的,其他对象都是正室的下手.或者叫侧室也不足为过. 2.细数BOM

[JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播

-->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的onclick事件也会被触发.js里称这种事件连续发生的机制为事件冒泡或者事件捕获.IE浏览器:事件从里向外发生,事件从最精确对象(target)开始触发,然后到最不精确的对象(document)触发,即事件冒泡 Netscape:事件从外向里发生,事件从最不精确的对象(document)开始触发,然后到最精确对象(

js中的事件部分总结

一.HTML事件 HTML事件处理就是直接在HTML标签上添加事件,举例 <p class="" onclick=function(){alert(HTML事件)}></p> 这种方式的好处是简单易懂,兼容性好. 缺点是代码的耦合性太高,不便于修改,而且一个事件只能监听一个function,多个function会被覆盖,并且事件无法删除. 二.DOM 0级处理事件 DOM 0级处理事件可以理解成通过修改标签元素的onclick属性,来加入事件. 举例 <d

js中尺寸类样式

js中尺寸类样式 一:鼠标尺寸类样式 都要事件对象的配合 Tip:注意与浏览器及元素尺寸分开,鼠标类尺寸样式都是X,Y,浏览器及元素的各项尺寸时Height,Width 1:检测相对于浏览器的位置:event.clientX/event.clientY client:整个浏览器的可视区域,当点击鼠标的时候,鼠标事件发生的位置距离浏览器可视区域的左边和上边的距离 clientX:鼠标事件发生的位置距离浏览器可视区域的左边的距离 clientY:鼠标事件发生的位置距离浏览器可视区域的上边的距离 2:

JS中事件冒泡(Bubble)和事件捕获(Capture)以及如何阻止事件的冒泡

对“捕获”和“冒泡”这两个概念,通常我们对冒泡了解和使用的会更多一些,因为在我们使用的所有浏览器中,都支持事件冒泡 ,即事件由子元素向祖先元素传播的,就 像气泡从水底向水面上浮一样.而在像firefox,chrome,safari这类所谓的标准浏览器中,事件传播通常是有三个阶段的:事件捕获阶段,事件目标阶段,事件冒泡阶段,这三者的执行的顺序是先捕获在冒泡.对于捕获阶段,这个很少 有用武之地,所以被人疏忽遗忘也在所难免了,不常用不代表它不存在,本着科学严谨的态度,我们有必要去看一下它的庐山真面目.

js中阻止事件冒泡和浏览器默认行为

在使用javascript编程时会遇到一个问题,就是当你给html添加事件时,由于浏览器默认的为冒泡型事件触发机制,所以会触发你不想触发的事件.那么通过如下的函数可以解决这个问题.[兼容IE和FF] 1.阻止事件冒泡,使成为捕获型事件触发机制. function stopBubble(e) { //如果提供了事件对象,则这是一个非IE浏览器 if ( e && e.stopPropagation ) //因此它支持W3C的stopPropagation()方法 e.stopPropagat

JS中绑定事件顺序(事件冒泡与事件捕获区别)

在JS中,绑定的事件默认的执行时间是在冒泡阶段执行,而非在捕获阶段(重要),这也是为什么当父类和子类都绑定了某个事件,会先调用子类绑定的事件,后调用父类的事件.直接看下面实例 <!Doctype html> <html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> *{margin:0;p