javaScript事件流

218 阅读1分钟

事件流定义:

事件流描述的是从页面中接受事件的顺序,但有意思的是,微软(IE)和网景(Netscape)开发团队居然提出了两个截然相反的事件流概念,IE的事件流是事件冒泡流(event bubbling),而Netscape的事件流是事件捕获流(event capturing)

第一种:事件冒泡

IE提出的事件流叫做事件冒泡,即事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body onclick="bodyClick()">

  <div onclick="divClick()">
      <button onclick="btn()">
          <p onclick="p()">点击冒泡</p>
      </button>
  </div>
  <script>
     
     function p(){
        console.log('p标签被点击')
     }
      function btn(){
          console.log("button被点击")
      }
       function divClick(event){
           console.log('div被点击');
       }
      function bodyClick(){
          console.log('body被点击')
      }

  </script>

</body>
</html>

第二种:事件捕获

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

<div>
  <button>
      <p>点击捕获</p>
  </button>
</div>
<script>
  var oP=document.querySelector('p');
  var oB=document.querySelector('button');
  var oD=document.querySelector('div');
  var oBody=document.querySelector('body');

  oP.addEventListener('click',function(){
      console.log('p标签被点击')
  },true);

  oB.addEventListener('click',function(){
      console.log("button被点击")
  },true);

  oD.addEventListener('click',  function(){
      console.log('div被点击')
  },true);

  oBody.addEventListener('click',function(){
      console.log('body被点击')
  },true);

</script>
</body>
</html>

DOM事件流:

DOM2级事件规定的事件流包含3个阶段,事件捕获阶段、处于目标阶段、事件冒泡阶段。首先发生的事件捕获为截获事件提供机会,然后是实际的目标接收事件,最后一个阶段是事件冒泡阶段,可以在这个阶段对事件做出响应。在DOM事件流中,事件的目标在捕获阶段不会接收到事件,这意味着在捕获阶段事件从document到

就停止了,下个阶段是处于目标阶段,于是事件在

上发生,并在事件处理中被看成冒泡阶段的一部分,然后,冒泡阶段发生,事件又传播回document。 下面是我们模拟它的示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button id="btn">DOM事件流</button>
<script>
var btn=document.getElementById("btn");
btn.onclick=function(event){
console.log("div 处于目标阶段");
};
document.body.addEventListener("click",function(event){
console.log("event bubble 事件冒泡");
},false);
document.body.addEventListener("click",function(event){
console.log("event catch 事件捕获");
},true);
</script>
</body>
</html>