js 事件流、事件冒泡、事件捕获、阻止事件的传播

简介: js 事件流、事件冒泡、事件捕获、阻止事件的传播

事件流

js 事件的执行过程分为捕获阶段(由外层节点传播到内层节点)和冒泡阶段(由内层节点传播到外层节点),即先执行捕获阶段的代码,后执行冒泡阶段的代码

事件冒泡

js 事件中的代码默认在冒泡阶段执行,以下图为例,点击box2时,会依次触发box2的点击事件【冒泡阶段执行】、box1的点击事件【冒泡阶段执行】、window的点击事件【冒泡阶段执行】。

  window.addEventListener("click", function (e) {
    if (e.target.id === "box2") {
      console.log("点击box2触发window的click事件");
    } else if (e.target.id === "box1") {
      console.log("点击box1触发window的click事件");
    } else {
      console.log("触发了window的click事件");
    }
  });

  document.getElementById("box1").addEventListener("click", function (e) {
    console.log("触发了box1的click事件");
  });

  document.getElementById("box2").addEventListener("click", function (e) {
    console.log("触发了box2的click事件");
  });

事件捕获

给 addEventListener 函数的第三个参数传入 true ,便会将事件中的代码改为在捕获阶段执行,此时点击box2时,会依次触发window的点击事件【捕获阶段执行】,box2的点击事件【冒泡阶段执行】,box1的点击事件【冒泡阶段执行】。

  window.addEventListener(
    "click",
    function (e) {
      if (e.target.id === "box2") {
        console.log("点击box2触发window的click事件");
      } else if (e.target.id === "box1") {
        console.log("点击box1触发window的click事件");
      } else {
        console.log("触发了window的click事件");
      }
    },
    //改为在捕获阶段执行
    true
  );

  document.getElementById("box1").addEventListener("click", function (e) {
    console.log("触发了box1的click事件");
  });

  document.getElementById("box2").addEventListener("click", function (e) {
    console.log("触发了box2的click事件");
  });

阻止事件的传播

使用

e.stopPropagation()

范例:点击box2时,只触发box2的点击事件,不触发box1和window的点击事件

  window.addEventListener("click", function (e) {
    if (e.target.id === "box2") {
      console.log("点击box2触发window的click事件");
    } else if (e.target.id === "box1") {
      console.log("点击box1触发window的click事件");
    } else {
      console.log("触发了window的click事件");
    }
  });

  document.getElementById("box1").addEventListener("click", function (e) {
    console.log("触发了box1的click事件");
  });

  document.getElementById("box2").addEventListener("click", function (e) {
    console.log("触发了box2的click事件");
    // 阻止事件继续传播
    e.stopPropagation();
  });

实战范例

需求:

  1. 点击box2时,只执行window点击事件中通过点击box2触发window点击事件的代码,不执行box1的点击事件代码
  2. 点击box1时,只执行box1的点击事件代码,不执行window点击事件中通过点击box1触发window点击事件的代码
  window.addEventListener(
    "click",
    function (e) {
      if (e.target.id === "box2") {
        console.log("点击box2触发window的click事件");
        // 阻止事件继续传播
        e.stopPropagation();
      } else if (e.target.id === "box1") {
        return;
        console.log("点击box1触发window的click事件");
      } else {
        console.log("触发了window的click事件");
      }
    },
    true
  );

  document.getElementById("box1").addEventListener("click", function (e) {
    console.log("触发了box1的click事件");
  });

  document.getElementById("box2").addEventListener("click", function (e) {
    console.log("触发了box2的click事件");
  });

目录
相关文章
|
JavaScript 前端开发 UED
JS DOM 事件流与事件冒泡
【10月更文挑战第16天】理解 DOM 事件流和事件冒泡是掌握 JavaScript 事件处理的关键。通过合理利用事件冒泡,可以实现更高效、灵活的事件处理机制,提升用户体验和开发效率。在实际开发中,要根据具体情况灵活运用这些概念,以达到最佳的效果。
236 42
|
7月前
|
JavaScript 前端开发 Java
【Java进阶】详解JavaScript事件
总的来说,JavaScript事件是JavaScript交互设计的核心,理解和掌握JavaScript事件对于编写高效、响应式的网页应用至关重要。
149 15
|
JavaScript
js两种移除事件的方法
js两种移除事件的方法
148 3
|
10月前
|
JavaScript 前端开发 测试技术
盘点原生JavaScript中直接触发事件的方式
本文全面探讨了原生JavaScript中触发事件的多种方式,包括`dispatchEvent`、`Event`构造函数、`CustomEvent`构造器、直接调用事件处理器以及过时的`createEvent`和`initEvent`方法。通过技术案例分析,如模拟点击事件、派发自定义数据加载事件和实现提示框系统,帮助开发者掌握这些方法在实际开发中的应用,提升灵活性与兼容性。
384 3
|
11月前
|
JavaScript 前端开发
捕获键盘输入和输入组合键的js库hotkeys
捕获键盘输入和输入组合键的js库hotkeys
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
440 5
|
存储 JavaScript 前端开发
js事件队列
【10月更文挑战第15天】
203 6
|
JavaScript
js两种移除事件的方法
js两种移除事件的方法
|
JavaScript API
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
717 0
|
JavaScript
js两种移除事件的方法
js两种移除事件的方法
141 0