js 事件流

134 阅读2分钟

什么是事件流

事件流指的是,当有事件发生时,当前节点和根节点之间按照一定的顺序传播的过程就是事件流,通常会分为冒泡事件和捕获事件,而这两种事件传播过程恰好是相反的

冒泡事件

image.png

当我们点击span时候,span会首先接收到click事件,接下来事件会继续向父元素传播,div->body->html->document会由子到父的依次传播,直到传递给document,这种传播流程我们称为冒泡事件,默认情况下我们所添加的事件都是冒泡事件

冒泡事件特性的妙用:事件代理

image.png

如果我们想要获取span的点击事件,通常是这样的

var spanList  = document.getElementsByTagName("span")
    console.log(span);
    for(let i=0;i<spanList.length;i++){
        spanList[i].onclick = function(){
        console.log('span');
    }
}

现在我们利用事件代理来实现:父节点接受委托给子节点分配点击事件

 // 给父层元素绑定事件
document.getElementById('div').addEventListener('click', function (e) {
  var target = event.target || event.srcElement;
  console.log(event.target.textContent)
});

这样通过代理的方式,我们可以减少事件绑定数量,减少内存消耗

阻止冒泡事件

  <body onclick="handleClickBody()">
    <div onclick="handleClickDiv()">
      <button id="btn1" onclick="handleClickBtn1(event)">
        按钮
      </button>
    </div>
  </body>
   <script>
    // 第一种方法
    function handleClickBtn1(e){
      console.log(e);
      console.log('点击htn1');
      e.stopPropagation();
    }
    // 第二种方法
    var bd = document.getElementById("btn1");
    bd.addEventListener("click", function (event) {
      if (event.target == this) {
        //判断是否是当前绑定事件的元素元素触发的该事件
        console.log("按钮被点击了");
        event.cancelBubble = true;
      }
    });
    //解决兼容性问题,在低版本浏览器中(IE 6-8 )通常是利用事件对象cancelBubble属性来操作的
    function handleClickBtn1(e) {
      if (e && e.stopPropagation) {
        e.stopPropagation();
      } else {
        window.event.cancelBubble = true;
      }
    }
  </script>

捕获事件

image.png

捕获事件与冒泡事件恰好相反,我们想要捕获事件就需要使用addEventListener方法,将第三个参数给为true,那这个就开始进行捕获,捕获事件就调用回调函数,它的传播是doucment->body->div->span

document.getElementsByTagName('document').addEventListener('click',function () {  

console.log('document')  

},true)
document.getElementsByTagName('html').addEventListener('click',function () {  

console.log('html')  

},true)
document.getElementsByTagName('div').addEventListener('click',function () {  

console.log('div')  

},true)
document.getElementsByTagName('span').addEventListener('click',function () {  

console.log('span')  

},true)

addEventListener 介绍

addEventListener( name , function , boolean )

boolean (true) :该事件为捕获事件,当事件触发时候,在捕获阶段就执行

boolean (false) :该事件为冒泡事件,当事件触发时候,在冒泡阶段就执行

事件流程 :

  1. span 被点击

  2. document上面绑定了捕获事件,会执行document上面的捕获事件

  3. html上面绑定了捕获事件,会执行html上面的捕获事件  

  4. div上面绑定了捕获事件,会执行div上面的捕获事件

  5. span上面绑定了捕获事件,会执行span上面的捕获事件

  6. span上面绑定了冒泡事件,会执行span上面的冒泡事件

  7. div上面绑定了冒泡事件,会执行div上面的冒泡事件

8.html上面绑定了冒泡事件,会执行html上面的冒泡事件

9.document上面绑定了冒泡事件,会执行document上面的冒泡事件

10.结束

总结

事件流就是页面中元素接收事件的顺序,从捕获事件到冒泡事件的传播,是一种U形事件传播过程

如有错误欢迎指正,希望和同学们互相学习,共同进步,加油!