事件传播过程,阻止传播的效果

事件传播过程

事件流

事件流描述的是从页面中接收事件的顺序,比如有两个嵌套的div,点击了内层的div,这时候是内层的div先触发click事件还是外层先触发?目前主要有三种模型

事件冒泡:事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的元素

事件捕获:不太具体的节点更早接收事件,而最具体的元素最后接收事件,和事件冒泡相反

DOM事件流:DOM2级事件规定事件流包括三个阶段,事件捕获阶段,处于目标阶段,事件冒泡阶段,首先发生的是事件捕获,为截取事件提供机会,然后是实际目标接收事件,最后是冒泡阶段

这种分歧在日常生活中也很常见,举个例子,某个地方出了抢劫事件,我们有多种处理方式

村里先发现,报告给乡里,乡里报告到县城,县城报告给市里。。。。
市里先知道这事儿,然后交代给县城怎么处理,县城交给到乡里处理,乡里交给村里处理

  • 事件冒泡模型


    image
  • 事件捕获模型


    image
  • DOM事件流


    image

示例

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <style>
  .box1{
    width:300px;
    height:300px;
    border:1px solid;
    border-radius:150px;
    background:red;
  }
  .box2{
    width:200px;
    height:200px;
    border:1px solid;
    margin-top:50px;
    margin-left:50px;
    border-radius:100px;
    background:blue;
  }
  .box3{
    width:100px;
    height:100px;
    border:1px solid;
    margin-top:50px;
    margin-left:50px;
    border-radius:50px;
    background:green;
  }
  </style>
</head>
<body>
<div class="box1">
    <div class="box2">
      <div class="box3"> 
      </div>
    </div>
  </div>
  <script>
  
var box1 = document.querySelector('.box1')
var box2 = document.querySelector('.box2')
var box3 = document.querySelector('.box3')
box1.addEventListener('click',function(){
  console.log("click .box1.. 红色")
},true)
box2.addEventListener('click',function(){
  console.log("click .box2.. 蓝色")
},true)
box3.addEventListener('click',function(){
  console.log("click .box3.. 绿色")
},true)
box1.addEventListener('click',function(){
  console.log("click .box1.. 红色")
},false)
box2.addEventListener('click',function(){
  console.log("click .box2.. 蓝色")
},false)
box3.addEventListener('click',function(){
  console.log("click .box3.. 绿色")
},false)
  </script>
</body>
</html>

通过点击box3,会输出


image

通过输出的内容我们可以清楚的看出事件的传播过程。
true是时间冒泡 , false为事件捕获

阻止传播

stopPropagation()取消事件进一步捕获或冒泡

定义和用法

不再派发事件。
终止事件在传播过程的捕获、目标处理或起泡阶段进一步传播。调用该方法后,该节点上处理该事件的处理程序将被调用,事件不再被分派到其他节点

通过上个示例,我们给box3事件中添加stopPropagation()方法

//在box3后面添加box4更方便观察 设置成黄色
box3.addEventListener('click',function(e) {}
console.log("click .box3.. 绿色")
e.stopPropagation()
)

效果:


image

可以清除的看到事件传播到box3后,就不再执行后面的事件

注意 这是阻止事件的冒泡方法,不让事件向documen上蔓延,但是默认事件任然会执行,当你掉用这个方法的时候,如果点击一个连接,这个连接仍然会被打开.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容