js事件流模型

js 事件流模型

JavaScript的事件流模型可以被概括为三个阶段:捕获阶段,目标阶段和冒泡阶段。这个模型是在DOM(文档对象模型)中定义的,用于描述事件如何在DOM元素中传播。

  1. 捕获阶段:在事件到达其目标元素之前,事件首先会从顶层(通常是document对象)开始,通过DOM树向下传递。这个阶段被称为事件捕获。在捕获阶段,事件处理器会对从顶层开始,一直到目标元素的所有元素触发处理程序。
  2. 目标阶段:在事件到达目标元素时,事件处理器会对目标元素执行处理程序。这个阶段被称为目标阶段。
  3. 冒泡阶段:在离开目标元素后,事件会返回到它来自的元素,这个阶段被称为冒泡阶段。冒泡过程中,每个元素都有机会处理事件,直到事件到达最初的那个顶层元素。

注意,在某些情况下,开发者可以在事件处理函数中通过调用event.stopPropagation()方法来阻止事件进一步冒泡。同样,他们也可以通过调用event.stopImmediatePropagation()来阻止事件冒泡并阻止任何其他同类型事件的处理程序被调用。

另外,对于某些事件(例如点击事件),浏览器会默认只在冒泡阶段处理它们。如果需要在捕获阶段处理这些事件,可以使用addEventListener()方法的第四个参数,将其设定为true(表示在捕获阶段处理事件)。

这就是JavaScript的事件流模型。

例如,下面的代码演示了如何通过 addEventListener()方法,在捕获阶段和冒泡阶段分别监听同一个事件:

var element = document.getElementById("myElement");

element.addEventListener(
  "click",
  function (event) {
   
    console.log("捕获阶段");
  },
  true
);

element.addEventListener(
  "click",
  function (event) {
   
    console.log("冒泡阶段");
  },
  false
);

当元素被点击时,首先会触发捕获阶段的事件处理函数,然后再触发冒泡阶段的事件处理函数。

需要注意的是,大部分事件都是在冒泡阶段进行处理。

但也有一些特殊的事件,如 focus 和 blur 事件,则只在捕获阶段触发。

此外,通过调用 event.stopPropagation()方法可以阻止事件继续传播,即停止冒泡或捕获。

更多详细内容,请微信搜索“前端爱好者戳我 查看

js 事件循环

JavaScript 的事件循环是其执行机制的核心,它决定了代码的执行顺序和时间。以下是 JavaScript 事件循环的基本步骤:

  1. 调用栈:当一个 JavaScript 程序开始执行时,从顶部开始,逐行执行代码。每行代码执行完后,将结果推入调用栈。
  2. 任务队列:当遇到异步事件(如定时器、网络请求等)时,事件处理程序被放入任务队列中,等待调用栈为空时才执行。
  3. 事件循环:当调用栈为空时,事件循环会检查任务队列,并将任务添加到调用栈中执行。然后再次清空调用栈,重复此过程。

具体来说,JavaScript 的事件循环有以下几个步骤:

  1. 脚本执行:从调用栈的顶部开始,执行脚本代码。
  2. 任务调度:当脚本执行遇到异步事件(如 setTimeout, fetch 等)时,这些事件会被添加到任务队列中。
  3. 微任务调度:在每个事件循环中,首先处理微任务队列(如 Promise, setImmediate 等)。微任务通常比宏任务(如 setTimeout, fetch 等)更快。
  4. 宏任务调度:处理完微任务后,处理宏任务队列(如 setTimeout, fetch, UI 渲染等)。
  5. 重复:再次从调用栈开始执行脚本,重复以上步骤。

以上就是 JavaScript 的事件循环机制,它确保了代码的顺序和异步执行。

相关推荐

  1. js事件模型

    2023-12-08 05:54:03       45 阅读
  2. js 事件模型 事件捕获、事件冒泡

    2023-12-08 05:54:03       16 阅读
  3. 事件 事件委托

    2023-12-08 05:54:03       34 阅读
  4. Node.js事件驱动模型(非阻塞I/O)

    2023-12-08 05:54:03       20 阅读
  5. js事件循环

    2023-12-08 05:54:03       28 阅读
  6. js事件

    2023-12-08 05:54:03       15 阅读
  7. 【Node.js

    2023-12-08 05:54:03       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 05:54:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 05:54:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 05:54:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 05:54:03       20 阅读

热门阅读

  1. MySql常用面试题

    2023-12-08 05:54:03       32 阅读
  2. 剑指 Offer(第2版)面试题 27:二叉树的镜像

    2023-12-08 05:54:03       42 阅读
  3. 如何进行多ip服务器租用?

    2023-12-08 05:54:03       36 阅读
  4. linux-tar命令、解压、压缩

    2023-12-08 05:54:03       38 阅读
  5. Linux硬链接和软连接是什么?

    2023-12-08 05:54:03       41 阅读
  6. Python 中 Thread 线程的用法

    2023-12-08 05:54:03       37 阅读
  7. [linux] 解压缩xz

    2023-12-08 05:54:03       39 阅读
  8. 中国证券交易所有哪些

    2023-12-08 05:54:03       27 阅读
  9. 贝蒂的捣蛋小游戏~(C语言)

    2023-12-08 05:54:03       35 阅读
  10. Django的模板标签相关知识累

    2023-12-08 05:54:03       37 阅读
  11. vue开发,axios网络请求框架基本用法和封装

    2023-12-08 05:54:03       33 阅读