为什么事件上的composedPath在延迟时返回不同的值?

2024-01-16

因为简单来说path不存在于MouseEvent or WheelEvent类型,我正在使用替代方案:composedPath方法。直到现在我还无法体验到它们之间的区别。我包裹了我的wheel听众与requestAnimationFrame,令人惊讶的是composedPath返回一个空数组。举个例子:

window.addEventListener('click', e => {
  console.log('at event:', Array.from(e.composedPath()));
  setTimeout(() => {
    console.log('after event:', Array.from(e.composedPath()));
  }, 0)
})
#test {
  width: 120vw;
  height: 120vh;
}
<div id='test'></div>

(建议检查浏览器的控制台,因为window有点大,无法滚动浏览)

如果有人知道我如何解决这个问题,那么知道它会很高兴,但问题主要是要了解造成差异的原因。


该规范定义了此行为。在步骤结束时调度事件 https://dom.spec.whatwg.org/#dispatching-events, 我们有:

  1. (循环遍历祖先元素,将它们添加到事件的路径中)

...

  1. Set event’s path https://dom.spec.whatwg.org/#event-path到空列表。

也就是说,在第5步中浏览器填写路径信息,在第8步中(所有事件处理完成后),规范明确规定浏览器必须清除路径信息。

该规范的特点是没有说why, but Kaiido https://stackoverflow.com/users/3702797/kaiido 指出 https://stackoverflow.com/questions/62181537/why-does-composedpath-on-event-returns-different-value-when-delayed/74610934?noredirect=1#comment131699356_74610934 that 添加步骤 8 的提交 https://*%20The%20path%20you%20get%20back%20is%20determined%20in%20part%20by%20the%20%60currentTarget%60%20of%20the%20event%20you%20call%20%60composedPath%60%20on%20(in%20particular%20in%20relation%20to%20the%20shadow%20DOM),%20which%20of%20course%20varies%20depending%20on%20what%20event%20listener%20is%20active.%20Once%20the%20event%20has%20been%20fully%20dispatched,%20%60currentTarget%60%20is%20set%20to%20%60null%60.%20If%20you%20work%20through%20the%20steps%20of%20%5B%60composedPath%60%5D%5B2%5D,%20you%27ll%20see%20that%20even%20if%20the%20path%20information%20hadn%27t%20been%20cleared%20when%20dispatch%20was%20complete,%20calling%20%60composedPath%60%20when%20%60currentTarget%60%20is%20%60null%60%20would%20just%20return%20the%20path%20%60%5Bnull%5D%60%20(if%20I%27m%20reading%20the%20steps%20correctly),%20which%20wouldn%27t%20be%20of%20any%20use.主要关注与 Shadow DOM 相关的事件路径的处理。无论如何,你返回的路径部分取决于currentTarget您调用的事件的composedPathon(特别是与影子 DOM 相关),以及currentTarget仅当事件正在被主动调度时才有意义(一旦事件被完全调度,currentTarget被设定为null)。即使步骤 8 没有清除路径,如果我正在阅读以下步骤composedPath https://dom.spec.whatwg.org/#dom-event-composedpath正确,它只会返回路径[null]当被呼叫时currentTarget is null,这没有任何用处。 (对于非 Shadow-DOM 的原因,这也是有意义的:事件对象通常被永远不会调用的函数关闭composedPath,因此不必要地将这些信息保留在内存中是有意义的。路径中的任何元素稍后从 DOM 中删除都会无缘无故地弄乱内存。但证据表明这并不是添加步骤 8 的主要动机。)

如果您需要事件的路径,只需在处理期间而不是之后获取它即可。

window.addEventListener("click", (e) => {
    const path = Array.from(e.composedPath(), (e) => e === window ? "window" : e.nodeName);
    setTimeout(() => {
        console.log(path);
    }, 0);
});
window.addEventListener("click", (e) => {
    const path = Array.from(e.composedPath(), (e) => e === window ? "window" : e.nodeName);
    setTimeout(() => {
        console.log(path);
    }, 0);
});
#test {
  width: 120vw;
  height: 120vh;
}
<div id='test'></div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么事件上的composedPath在延迟时返回不同的值? 的相关文章

  • 如何在 Windows 网络中的 Intranet Web 应用程序中获取用户的用户名

    我内部有一个简单的 HTML 页面 它只显示一个表单并要求用户填写 我想自动捕获Windows域用户名和机器名 并将其与表单中收集的数据一起提交 我可以在客户端这样做吗 HTML JavaScript 或者我被迫在服务器端执行此操作 我还不
  • 使用 VSCode 的 EJS 文件缩进错误

    我在 VSCode 上遇到 EJS 文件问题 每次保存文件时 格式化程序都会应用错误的缩进 在每个 EJS 标识符下方 下一行向右移动 缺少正确的垂直对齐 我使用 ejs 的 HTML 格式并安装了 DigitalBrainstem 的 E
  • 如何使用 Nextjs/React 将 JSON 对象导出到 Excel?

    我有一个检索 json 对象的端点 如下所示 data id 1 temaIndicador Indian codigo 001 observaciones Interactions Specialist tertiary Regional
  • 保证金如何运作?

    我在下面提供了marginfix这是一个块级元素并且one and two也是块级的 但它们是浮动的 这就是为什么它们位于同一行布局的原因 但是marginfix也不浮动 块级元素应位于该元素下方 如下所示
  • 如何在单击按钮时清除反应挂钩中的间隔

    我正在用反应钩子构建一个简单的计时器 我有两个按钮启动和重置 当我单击开始按钮时 handleStart 函数工作正常 计时器启动 但我不知道如何在单击重置按钮时重置计时器 这是我的代码 const App gt const timer s
  • 公开闭包内的方法

    当我们在闭包内创建一个方法时 该方法将成为该闭包的私有方法 并且在我们以某种方式公开它之前无法访问它 怎么可能暴露呢 您可以返回对它的引用 var a function var b function I m private alert go
  • 如何将React JS状态保存到本地存储中

    我不知道如何将 React js 状态存储到本地存储中 import React Component from react import App css import auth createUserProfileDocument from
  • iPhone 上的锁定方向 UIWebView

    有没有办法锁定 UIWebView 的方向 使用 Obj C JS 还是 Html 我不想有按钮或任何东西 我只想在应用程序打开时将其锁定为纵向 好像这个堆栈溢出帖子 https stackoverflow com questions 43
  • 为什么 console.log() polyfill 不使用 Function.apply()?

    我一直在看一些流行的console log 包装 填充 保罗 爱尔兰的 http paulirish com 2009 log a lightweight wrapper for consolelog 本阿尔曼的 http benalman
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 为什么 TypeScript 混合了模块和原型模式?

    我正在查看此页面上 TypeScript 生成的 JS 代码 http www typescriptlang org Playground http www typescriptlang org Playground 基本上 要创建一个Gr
  • 如何禁用网页中的萤火虫?

    如何使用 Javascript 禁用 firebug 我想这样做是为了向访问者隐藏我的网页的运作方式 有什么选择可以做到这一点吗 你不能 你能做的最好的事情就是混淆你的 JavaScript 实际上刮掉了 您能做的最好的事情就是将所有安全关
  • Firebase 身份验证和实时应用程序数据库如何保护自身安全?

    从一般开发的角度来看 我很好奇如何保护在线资源的访问 我们使用以下 Firebase 配置参数初始化 Web 应用程序 apikey authdomain projectid databaseurl messagesenderid 服务器如
  • jQuery:向左滑动和向右滑动

    我见过slideUp and slideDown在 jQuery 中 左右滑动的功能 方式怎么样 您可以使用 jQuery UI 中的附加效果来做到这一点 详情请参阅此处 http docs jquery com UI Effects Sl
  • 加载 Angular 库时,IE9 和 IE10 中出现 Angular JS“SCRIPT5007:预期对象”错误

    我正在开发一个 AngularJS 应用程序 该应用程序应在 Firefox IE 9 和 IE 10 上运行 我使用最新版本的 angularjs 库 现在是 1 3 15 服务器端是在JavaEE平台上用Java编写的 服务器运行在Gl
  • 测试 jQueryUI 是否已加载

    我正在尝试调试网站 并且我认为 jQueryUI 可能未正确加载 如何测试 jQueryUI 是否已加载 if jQuery ui UI loaded OR if typeof jQuery ui undefined UI loaded 应
  • 在什么情况下,使用 HTTP/2 单独加载图像会比使用 HTTP/1.1 中的精灵一次加载所有图像慢?

    HTTP 2 使多路复用连接成为可能 从而消除了与服务器的多个连接的需要 通过单个连接 可以将许多单独的图像发送到客户端 这避免了将多个图像组合成一个并使用 CSS 将其分开的旧图像精灵模式 我很好奇精灵在 HTTP 2 世界中是否仍然会更
  • Radiobutton-带有纯 html/css 的按钮

    是否可以创建像这样的单选按钮JQuery http jqueryui com demos button radio那些 用纯html css thanks 试试这个小提琴 http jsfiddle net mcXm7 1 http jsf
  • HTML5 地理定位 - 在 iOS 上无法始终工作

    目前正在使用 HTML5 地理定位 我已经在所有网络浏览器上测试了它 它似乎工作正常 然而 当我在 iPad 上测试地理定位时 它在 iPad mini 上始终有效 但当我将其放在更大的 iPad iPad 2 上时 位置似乎并不总是有效
  • 拉斐尔路径交叉点不起作用

    我对拉斐尔和 pathIntersection method JSFiddle 示例 http jsfiddle net t6gWt 2 您可以看到有两条线都与曲线相交 但当我使用 pathIntersection method 有一个未解

随机推荐