美文网首页
浏览器的事件机制-捕获与冒泡

浏览器的事件机制-捕获与冒泡

作者: Doter | 来源:发表于2020-03-18 20:40 被阅读0次

前短时间有个面试,被问到浏览器事件机制,然后才感受到了,自己对底层知识有多差劲。

事件流程

先向下捕获,再向上冒泡。


image.png

简单来说,当你鼠标在浏览器上点击了一下。

  1. 浏览器捕获到了click事件。
  2. 然后浏览器根据你点击的事件,从window开始向下,就会触发每个父祖element捕获模式的事件回调。
  3. 直到找到点击所在的最终(最小的element)
  4. 然后浏览器开始继续又向上冒泡其父祖element的click事件,直至window。
  5. 默认的事件都是冒泡模式下触发的。

测试

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>event test</title>
</head>
<body>
  <div >
    <p>
      <span>test</span>
    </p>
  </div>
 <script>
   window.addEventListener("click",clickCallback,true)
   document.body.addEventListener("click",clickCallback,true)
   document.querySelector("div").addEventListener("click",clickCallback,true)
   document.querySelector("p").addEventListener("click",clickCallback,true)
   document.querySelector("span").addEventListener("click",clickCallback,true)
   document.body.addEventListener("click",clickCallback1)
   window.addEventListener("click",clickCallback1)
   document.querySelector("div").addEventListener("click",clickCallback1)
   document.querySelector("p").addEventListener("click",clickCallback1)
   document.querySelector("span").addEventListener("click",clickCallback1)
   
   
   function clickCallback(e){
     var nodeName = e.currentTarget == window?"window":e.currentTarget.nodeName;
      console.log("捕获:",nodeName)
   }

   function clickCallback1(e){
    var nodeName = e.currentTarget == window?"window":e.currentTarget.nodeName;
      console.log("冒泡:",nodeName)
   }
 </script>    
</body>
</html>
image.png

接下来

我们看看addEventListener第三个参数使用option,都又哪些
可用的选项如下:

  • capture: Boolean,表示 listener 会在该类型的事件捕获阶段传播到该 EventTarget 时触发。
  • once: Boolean,表示 listener 在添加之后最多只调用一次。如果是 true, listener 会在其被调用之后自动移除。
  • passive: Boolean,设置为true时,表示 listener 永远不会调用 preventDefault()。如果 listener 仍然调用了这个函数,客户端将会忽略它并抛出一个控制台警告。

以上三个参数都比较好理解。

最后再了解下

  1. 使用addEventListener为同一element设置多个clcik事件,其事件执行顺序?
    与js执行addEventListener的顺序一致,即事件注册的顺序一致。
  2. 使用addEventListener为同一element设置多个clcik事件,前面的事件执行stopPropagation,能否阻止后面事件?
    不能,只能阻止该事件(捕获)向下(冒泡)向上传播。
    3.e.preventDefault()只是阻止浏览器默认事件。

如下demo:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>event test</title>
</head>

<body>
  <div>
    <p>
      <span>test</span>
    </p>
  </div>
  <script>
    window.addEventListener("click", clickCallback, true)

    document.body.addEventListener("click", clickCallback, true)
    document.body.addEventListener("click", function testEvent1(e) {
      e.stopPropagation();
      e.preventDefault();
      console.log("test1")
    }, true)
    document.body.addEventListener("click", function testEvent2() {
      console.log("test2")
    }, true)
    document.querySelector("div").addEventListener("click", clickCallback, true)
    document.querySelector("p").addEventListener("click", clickCallback, true)
    document.querySelector("span").addEventListener("click", clickCallback, true)
    document.body.addEventListener("click", clickCallback1)
    window.addEventListener("click", clickCallback1)
    document.querySelector("div").addEventListener("click", clickCallback1)
    document.querySelector("p").addEventListener("click", clickCallback1)
    document.querySelector("span").addEventListener("click", clickCallback1)


    function clickCallback(e) {
      var nodeName = e.currentTarget == window ? "window" : e.currentTarget.nodeName;
      console.log("捕获:", nodeName)
    }
    function clickCallback1(e) {
      var nodeName = e.currentTarget == window ? "window" : e.currentTarget.nodeName;
      console.log("冒泡:", nodeName)
    }

  </script>
</body>

</html>
image.png

在捕获期阻止事件下传递后,该事件将不会再触发冒泡事件了。

相关文章

  • JS事件的冒泡捕获--发生了什么

    多次遇到事件冒泡与捕获相关的题目,冒泡和捕获机制在不同浏览器中的兼容性也不相同,IE中默认只支持冒泡机制,冒泡和捕...

  • --

    react事件机制 react基于浏览器原生事件机制,封装了一套自己的事件机制,包括事件注册、事件合成、冒泡和捕获...

  • 深入研究事件冒泡、事件捕获和事件委托

    以前听老师讲解事件冒泡和事件捕获机制的时候跟听天书一样,只依稀记得IE使用的是事件冒泡,其他浏览器则是事件捕获。当...

  • 2022-01-09 浏览器相关面试知识点

    一.详解浏览器事件捕获与冒泡 1. 事件委托/事件代理 捕获阶段-->目标阶段-->冒泡阶段 第三个参数为true...

  • Node.js 的 events 模块

    Node.js 没有浏览器的事件冒泡、事件捕获机制。 events 模块是 Node.js 基础及重要的模块, 只...

  • Javascript-Event事件(一)

    事件传播的过程 捕获 冒泡 DOM事件流 捕获 由不太具体的节点更早接收事件,而最具体的元素最后接收事件,机制与冒...

  • 浏览器事件机制

    浏览器事件机制(即冒泡和捕获,也称为事件流) 基础知识 操作系统最先知道用户点击了鼠标,浏览器次之 child 被...

  • 浏览器的事件机制-捕获与冒泡

    前短时间有个面试,被问到浏览器事件机制,然后才感受到了,自己对底层知识有多差劲。 事件流程 先向下捕获,再向上冒泡...

  • 图解事件委托

    事件捕获和事件冒泡 说到事件委托我们就不得不提JS中事件的整个历程中的两个机制:事件捕获和事件冒泡。 然而要说这事...

  • 前端系统学习 3. 浏览器相关

    1. 浏览器事件模型 事件的捕获和冒泡 addEventListener & removeEventListene...

网友评论

      本文标题:浏览器的事件机制-捕获与冒泡

      本文链接:https://www.haomeiwen.com/subject/ngpcyhtx.html