javascrpit 事件捕获和事件冒泡

事件捕获和事件冒泡涉及到了事件的流程,我们先来看一个例子:

一、 添加事件监听:给  window 添加点击的监听事件,输出 “别点了,受不了了“    偷笑

        


< script >
function say (){
console . log ( "别点了,受不了了!" );
}
window. addEventListener ( "click" , say ,false );
< / script >


二、上面我们已经知道如何添加监听,下面看一个例子,然后分析事件的流程:

事件流程的简单描述

              当我们给一个元素添加监听的时候,例如点击事件;


              首先这个事件进入的是捕获阶段,也就是从外层向内层探索,例如下面的三个div嵌套的例子,

              先找到到一个div,然后查看有没有绑定的事件,如果有,那么就执行相应的处理函数,如果

              没有相应的事件或者事件执行完成,那么继续向里面的第二个div探索,如果第二个div有绑定

              的事件,那么执行,如果没有,或者事件执行完成,继续向第三个div探索;

              

               目标阶段,假设我们点击的是第三个div,那么到达这个div然后执行相应的处理就是我们本来

               应该做的事情, 也就是我们的目标;

              

               冒泡阶段,假设我们的目标阶段执行完成,那么从第三个div依次到达第一个div,就是冒泡阶段,

               这个阶段, 所做的事情就是和捕获阶段相反的,如图所示;

                                       

                 当然了,默认情况下,我们嵌套的三个div执行的是冒泡事件,当然了,我们也可以设置是表现为

                捕获行为还是冒泡行为,下面通过代码实例来说明;


默认情况下是冒泡行为,我们先来看冒泡:

       我们定义三个嵌套的div,然后分别给每个div设置 click 监听,分别弹出不同的内容;

        效果图:

       


    代码实现:

<!DOCTYPE html>
< html>
< head>
< meta charset= "utf-8" >
< meta name= "newbean" />
< title > 事件捕获和事件冒泡 </ title >
< style type = "text/css" >
#a { width : 400 px ; height : 400 px ; background-color : #ccc ; padding : 50 px ;}
#b { width : 200 px ; height : 200 px ; background-color :pink; padding : 50 px ;}
#c { width : 80 px ; height : 80 px ; background-color :greenyellow; padding : 50 px ;}
< / style >
</ head>
< body>
< div id= "a" >我是第一个
< div id= "b" >我是第二个
< div id= "c" >
我是第三个
</ div >
</ div >
</ div >
< script >
var a = document. getElementById ( "a" );
var b = document. getElementById ( "b" );
var c = document. getElementById ( "c" );
a . addEventListener ( "click" , function (){
alert ( "我是第一个" );
});
b . addEventListener ( "click" , function (){
alert ( "我是第二个" );
});
c . addEventListener ( "click" , function (){
alert ( "我是第三个" );
});
< / script >
</ body>
</ html>

  

结果:当我们点击第一个div时,弹出  “ 我是第一个 ”;

          当我们点击第二个div时,先弹出“我是第二个”,再弹出“我是第一个”;

          当我们点击第三个div时,先弹出 “我是第三个”,再弹出我是“第二个”,最后弹出“我是第一个”;

          这个就是典型的时间冒泡;


我们再来看看捕获:

代码:

<!DOCTYPE html>
< html>
< head>
< meta charset= "utf-8" >
< meta name= "newbean" />
< title > 事件捕获和事件冒泡 </ title >
< style type = "text/css" >
#a { width : 400 px ; height : 400 px ; background-color : #ccc ; padding : 50 px ;}
#b { width : 200 px ; height : 200 px ; background-color :pink; padding : 50 px ;}
#c { width : 80 px ; height : 80 px ; background-color :greenyellow; padding : 50 px ;}
< / style >
</ head>
< body>
< div id= "a" >我是第一个
< div id= "b" >我是第二个
< div id= "c" >
我是第三个
</ div >
</ div >
</ div >
< script >
var a = document. getElementById ( "a" );
var b = document. getElementById ( "b" );
var c = document. getElementById ( "c" );
a . addEventListener ( "click" , function (){
alert ( "我是第一个" );
}, true );
b . addEventListener ( "click" , function (){
alert ( "我是第二个" );
}, true );
c . addEventListener ( "click" , function (){
alert ( "我是第三个" );
}, true );
< / script >
</ body>
</ html>


结果:当我们点击第一个div时,弹出  “ 我是第一个 ”;

          当我们点击第二个div时,先弹出“我是第一个”,再弹出“我是第二个”;

          当我们点击第三个div时,先弹出 “我是第一个”,再弹出我是“第二个”,最后弹出“我是第三个”;

          这个就是捕获行为;


和冒泡的区别就是我们加了一个参数:

obj.addEventListener("click",function,true);

这里的第三个参数如果不写,那么就是默认的冒泡行为;如果写上false,那么还是冒泡行为;

但是如果写上true,那么就是捕获行为;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值