JavaScript中的事件优先级是什么?

在JavaScript中,事件处理程序的执行顺序是由它们注册的顺序决定的。当一个事件被触发时,浏览器根据事件类型和处理程序注册的方式来确定哪个事件处理程序应该首先执行。

事件流

在深入了解事件优先级之前,我们需要理解事件流的概念。事件流描述的是从页面接收事件的顺序。在DOM中有两种事件流:冒泡和捕获。

冒泡

在事件冒泡中,事件会从被点击的元素开始向上冒泡,直到达到document对象。假设你有一个包含3个嵌套div的HTML文档,并在其中最后一个div添加了单击事件监听器:

---- -----------
  ---- ------------
    ---- -----------
    ------
  ------
------

--------
--- ----- - ---------------------------------
--- ------ - ----------------------------------
--- ----- - ---------------------------------

------------------------------- ---------- -
  ------------------ ----------
---

-------------------------------- ---------- -
  ------------------- ----------
---

------------------------------- ---------- -
  ------------------ ----------
---
---------

如果你在inner div上单击,那么先执行inner的事件处理程序,然后执行middle的,最后执行outer的。这就是事件冒泡的顺序。

捕获

在事件捕获中,事件从document对象开始向下传递,直到达到被点击的元素。如果你在inner div上单击,那么首先执行outer的事件处理程序,然后是middle的,最后才是inner的。

---- -----------
  ---- ------------
    ---- -----------
    ------
  ------
------

--------
--- ----- - ---------------------------------
--- ------ - ----------------------------------
--- ----- - ---------------------------------

------------------------------- ---------- -
  ------------------ ----------
-- ------

-------------------------------- ---------- -
  ------------------- ----------
-- ------

------------------------------- ---------- -
  ------------------ ----------
-- ------
---------

上面的代码演示了事件捕获的顺序。

事件优先级

当一个元素上注册了多个事件处理程序时,浏览器会按照以下顺序依次执行它们:

  1. 当前元素的捕获阶段事件处理程序。
  2. 祖先元素的捕获阶段事件处理程序,由外向内依次执行。
  3. 目标元素的事件处理程序。
  4. 祖先元素的冒泡阶段事件处理程序,由内向外依次执行。
  5. 当前元素的冒泡阶段事件处理程序。

这意味着当前元素的事件处理程序总是最先执行,然后是其祖先元素的事件处理程序(以捕获的顺序),最后是它们的孩子元素的事件处理程序(以冒泡的顺序)。

---- -----------
  ---- ------------
    ---- -----------
    ------
  ------
------

--------
--- ----- - ---------------------------------
--- ------ - ----------------------------------
--- ----- - ---------------------------------

------------------------------- ---------- -
  ------------------ ----------
-- ------

-------------------------------- ---------- -
  ------------------- ----------
-- ------

------------------------------- ---------- -
  ------------------ ----------
-- ------

------------------------------- ---------- -
  ------------------ ---------
---

-------------------------------- ---------- -
  ------------------- ---------
---

------------------------------- ---------- -
  ------------------ ---------
---
---------

在上面的代码示例中,当你在inner div上单击时,先执行捕获阶段的事件处理程序

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/15625


猜你喜欢

  • 连接字符串NodeJS / JavaScript [复制]的快捷方式

    连接字符串是JavaScript中最基本的操作之一。在Node.js和浏览器中,有许多方法可以实现这个任务。在本文中,我们将探讨最常见的字符串连接方法,并讨论它们之间的区别和性能。

    7 年前
  • Visual Studio 的 JavaScript 项目类型

    Visual Studio 是一个非常流行的集成开发环境,它支持多种编程语言和技术,其中包括 JavaScript。在 Visual Studio 中,有几种不同的 JavaScript 项目类型可供...

    7 年前
  • 可能的陷阱:CORS 的错误

    在前端开发中,我们经常会涉及到跨域资源共享(CORS)。CORS 机制允许一个网站向另一个网站发起 AJAX 请求,但是这种机制也存在一些潜在的安全问题和常见的错误。

    7 年前
  • 为什么有“(1);“XmlHttpRequest的反应?

    在前端开发中,我们经常会用到 XmlHttpRequest 对象来发送 HTTP 请求。但是在控制台输出请求结果时,有时会看到类似于“(1)”这样的反应,这篇文章将详细解释为什么会出现这种情况以及如何...

    7 年前
  • 如何继承 JavaScript 函数?

    JavaScript 函数是 JavaScript 中最基本的构建块之一,在编写前端代码时几乎无处不在。因此,函数的继承是非常重要的一部分,它可以让我们更高效地组织代码并将功能复用。

    7 年前
  • 如何获得30天之前,目前的日期?

    在前端开发中,我们经常需要获取日期。有时候,我们需要获取30天之前或目前的日期。这篇文章将介绍如何使用JavaScript获取这些日期。 获取当前日期 要获取当前日期,我们可以使用JavaScript...

    7 年前
  • 评论foreach绑定 VS knockoutjs foreach绑定

    在前端开发中,我们常常需要对列表数据进行渲染和操作。在实现这个过程中,一种常用的方式是使用循环结构来遍历列表,并将数据绑定到相应的视图上。在这方面,forEach 是 JavaScript 原生提供的...

    7 年前
  • Handlebars.js和Handlebars.runtime.js之间的区别

    Handlebars是一个JavaScript模板引擎,它可以让开发者更轻松地构建动态Web应用程序。Handlebars有两个不同的版本:Handlebars.js和Handlebars.runti...

    7 年前
  • 为什么未定义的数字返回数字?

    在前端开发中,我们经常会遇到一些奇怪的现象,例如在计算时,未定义或空的变量可能会返回数字值。这是为什么呢? 原因 这个问题的原因是 JavaScript 中的类型转换。

    7 年前
  • JavaScript Expando 对象

    在 JavaScript 中,Expando 对象是指使用未定义的属性名给对象赋值所创建的对象。这个特性看起来很方便,但它也会引发一些潜在的问题。 创建 Expando 对象 要创建 Expando ...

    7 年前
  • JavaScript中的对象序列化与反序列化:最佳实践

    在Web开发中,经常需要将JavaScript对象转换成字符串,以便在网络间传输或存储。这个过程称为序列化。另一方面,将序列化后的字符串转换回原始对象的过程称为反序列化。

    7 年前
  • JavaScript中的请求地址

    在前端开发中,与后端交互是必不可少的一部分。而在与后端进行数据交互时,请求地址显得尤为重要。本文将深入探讨JavaScript中的请求地址相关知识。 请求地址格式 在JavaScript中,请求地址可...

    7 年前
  • 如何在浏览器中实现 CommonJS 模块?

    在前端开发中,我们经常会使用 CommonJS 模块来组织代码。然而,在浏览器环境下,这些模块无法直接运行。本文将介绍如何要求 CommonJS 模块在浏览器中运行,让你的前端应用更加模块化和可维护。

    7 年前
  • 如何检查自定义协议是否支持

    在前端开发中,我们经常需要使用自定义协议来实现一些特定的功能。但是,不同的操作系统和浏览器对于自定义协议的支持程度是不同的。为了确保我们的应用程序可以正常运行,我们需要检查自定义协议在用户的设备上是否...

    7 年前
  • Node图像处理——使用Jimp及node-qrcode生成图片上传

    在前端开发中,图像处理是一个非常重要的技能。通过使用Node.js中的Jimp和node-qrcode库,可以快速、高效地生成二维码,并且将其作为图片上传到后台服务器。

    7 年前
  • web语义化之SEO和ARIA

    Web语义化之SEO和ARIA 在前端开发中,Web语义化是一门重要的技术。通过使用合适的HTML标签和属性来定义页面结构和内容,可以提高页面的可读性、可访问性和搜索引擎优化(SEO)等方面的表现。

    7 年前
  • 前端交互动画优化

    前端交互动画是用户体验的重要组成部分,可以增强用户与网站或应用之间的沟通与交互。然而,过多或者不够优化的动画效果可能会降低性能和用户体验。 动画优化的原则 在进行动画优化时,我们需要遵循以下原则: ...

    7 年前
  • 数据可视化学习d3.js

    数据可视化是现代Web应用程序中关键的一环,它可以让复杂的数据集更加直观、易于理解和使用。D3.js(Data-Driven Documents)是一个基于JavaScript的数据可视化库,已经成为...

    7 年前
  • 主干航线没有哈希?

    在前端开发中,我们通常会使用哈希(hash)来实现单页面应用程序(SPA)。但是,在某些情况下,使用主干航线(history)代替哈希可能更加优雅和可靠。本文将介绍主干航线的优点、缺点以及如何使用它来...

    7 年前
  • 启用跨域 Ajax 请求的 Firefox 设置

    在前端开发中,经常需要使用 Ajax 发送跨域请求。然而,在某些情况下,Firefox 默认会禁用跨域 Ajax 请求,这给我们的开发带来了不便。本文将介绍如何在 Firefox 中启用跨域 Ajax...

    7 年前

相关推荐

    暂无文章