为什么事件冒泡在分离的 DOM 元素中不起作用?

2024-02-21

我有一个父母<div>有一个孩子<div>在内存中 - 未附加到当前文档。我想触发一个CustomEvent关注孩子,但听父母的事件。这是我的代码:

var parent = document.createElement('div');
var child = document.createElement('div');
parent.appendChild(child);
parent.addEventListener('boom', function(event) {
    console.log('parent listener', event); // <~ This never runs!
});
var event = new CustomEvent('boom', { bubbles: true });
child.dispatchEvent(event);

该代码无法按预期工作。父级上的事件侦听器永远不会触发。这似乎与 JavaScript 事件系统相矛盾,事件从目标中冒出。但是,如果我将此代码段的最后两行修改为以下内容,回调将按照我的预期触发:

document.body.appendChild(parent);
child.dispatchEvent(event);

换句话说,如果我在分派事件之前将片段附加为文档的子树,则父事件侦听器将完全按预期触发。为什么?有没有办法在使用分离的 DOM 元素时允许冒泡?


为什么[冒泡对分离元素不起作用]?

为了回答你的第一个问题,我查看了W3C“UI 事件(以前称为 DOM Level 3 事件)”规范 http://www.w3.org/TR/uievents/,并且没有看到任何专门解决此问题的内容。但是,那事件阶段 http://www.w3.org/TR/uievents/#event-phase部分提到了一些使这种行为看起来合理的事情。

下一步,事件对象必须完成一个或多个事件阶段。该规范定义了三个事件阶段:捕获阶段、目标阶段和冒泡阶段。事件对象使用下面定义的部分传播路径按指定顺序完成这些阶段。如果不支持则必须跳过某个阶段,或者事件对象的传播是否已停止。例如,如果 Event.bubbles 属性设置为 false,则将跳过冒泡阶段,如果在调度之前已调用 Event.stopPropagation(),则必须跳过所有阶段。

强调我的。

然后规范继续列出各个阶段:

  1. The 捕获阶段: 事件对象必须通过目标的祖先从 Window 传播到目标的父级。该阶段也称为捕获阶段。为此阶段注册的事件侦听器必须在事件到达目标之前对其进行处理。
  2. The 目标阶段:事件对象必须到达事件对象的事件目标。此阶段也称为目标阶段。一旦事件到达目标,为此阶段注册的事件侦听器必须处理该事件。如果事件类型指示事件不得冒泡,则事件对象必须在此阶段完成后停止。
  3. The 气泡相: 事件对象以相反的顺序通过目标的祖先传播,从目标的父级开始并以 Window 结束。该阶段也称为冒泡阶段。为此阶段注册的事件侦听器必须在事件到达目标后对其进行处理。

再次强调我的。规范从未明确指出分离元素会发生什么。鉴于目标和冒泡阶段需要从元素到窗口的路径,并且分离元素上不可能有路径,因此必须跳过目标和冒泡事件阶段,因为这些路径不受支持。

有没有办法在使用分离的 DOM 元素时允许冒泡?

据我所知,没有任何内置的东西可以允许冒泡。您也许可以使用一些自定义代码来伪造冒泡,但这需要在每次触发事件时检查该元素是否已分离。

另一个想法是将元素添加到 DOM,触发事件,然后分离元素。由于我还没有测试过,所以我不知道它是否有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么事件冒泡在分离的 DOM 元素中不起作用? 的相关文章

  • 如何通过单击图像预览上的“x”从文件输入中删除图像?

    我目前有一个文件输入 一旦用户上传图像 就会显示图像预览 在图像预览上 有一个 x 可以从列表中删除图像预览 单击此 x 后 有什么方法可以从输入中的文件集中删除图像吗
  • 仅当表单已提交时才触发 jQuery 表单验证?

    不引人注目的验证基于这样的想法 don t进行表单验证 直到用户提交表单 一旦发生这种情况 如果表单上的某些内容无效 那么一旦用户更改了每个字段 就会立即验证它 我想做的是 不显眼地 触发表单元素的验证 也就是说 only如果用户已尝试提交
  • 如何更改传单中功能集的样式?

    我正在看等值区域的例子 https leafletjs com examples choropleth https leafletjs com examples choropleth 这是他们使用的数据源 type Feature prop
  • 如何使用 selenium 和 Mocha 获取 xPath() 选择的锚标记的文本

    我已经成功选择了 a 标签 我想显示锚标记的文本 但无法这样做 我正在使用 selenium mocha javascript 和 phantomJS 这是我的脚本 详细 var assert require assert var test
  • 网站 YouTube 嵌入视频不断播放

    我正在使用 youtube 提供的 iframe 在我的网站上嵌入视频 我还使用了一个 css 弹出窗口 这是我从这个页面学到的http www pat burt com web development how to do a css po
  • 如何使用 JavaScript 中的值填充下拉列表?

    我在 Tridion CMS 扩展中的功能区工具栏按钮中添加了一个按钮 单击该按钮后 将显示一个弹出页面 其中包含两个下拉菜单 通过更改第一个下拉控件中的值 我应该填充第二个下拉控件的值 就我而言 我正在使用ASP drop down li
  • 非 DOM 对象上的 jQuery 自定义事件

    我最近阅读了一些代码 其功能如下 bob name Bob Smith rank 7 bob bind nameChanged function bob trigger nameChanged 这似乎有效 但我在 jQuery 文档或源代码
  • Node js 使用中间件重定向进行过多重定向

    在我的 Node js 应用程序 我使用的是express 4 x 中 我想检查用户是否已登录 如果用户未登录 我想重定向到我的登录页面 然后我在中间件中这样做 服务器 js app use function req res next if
  • 如何仅在 NextJS 站点构建期间使用 getInitialProps?

    当使用 NextJS 构建静态站点时 我想要getInitialProps方法仅在构建步骤期间触发 而不是在客户端上触发 在构建步骤中 NextJS 运行getInitialProps 方法 https nextjs org docs fe
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • 仅一页 JavaScript 应用程序

    您是否尝试过单页 Web 应用程序 即浏览器仅从服务器 获取 一页 其余部分由客户端 JavaScript 代码处理 此类 应用程序页面 的一个很好的例子是 Gmail 对于更简单的应用程序 例如博客和 CMS 使用这种方法有哪些优点和缺点
  • HTML2canvas 和 Canvas2image,下载的屏幕截图不显示我的 HTML 图像

    我一直在开发一个 HTML 页面 我想将其转换为图像 我一直在使用 html2canvas 和 canvas2image 脚本并采用此代码http jsfiddle net 8ypxW 3 http jsfiddle net 8ypxW 3
  • Ebay api GetSellerList,解析响应 XML

    我正在使用 eBay 交易 api 来获取当前列出的卖家股票 我正在使用 GetSellerList 调用 我在解析 xml 时遇到问题 然后将其插入到网站商店中 这是 xml 请求
  • JavaScript 中数组的 HTML 数据列表值

    我有一个简单的程序 它必须从服务器上的文本文件中获取值 然后将数据列表填充为输入文本字段中的选择 为此 我想要采取的第一步是我想知道如何动态地将 JavaScript 数组用作数据列表选项 我的代码是
  • 如何让 jquery Tooltipster 插件适用于新创建的 DOM 元素?

    我正在使用 Tooltipster 插件http calebjacob com tooltipster http calebjacob com tooltipster 这很棒 但我已经动态生成了插入到 DOM 中的内容 工具提示程序似乎没有
  • Javascript - 将值从下拉框传递到 Google Maps API

    我正在使用 Google 地图 API 为一家出租车公司创建报价表 目前 用户在 2 个文本框中输入出发点和接载点 API 会计算两点之间的距离以及行程费用 我正在尝试添加两个具有设定位置的下拉框 以便用户可以选择这些位置之一或使用文本框输
  • 将 javascript 整数转换为字节数组并返回

    function intFromBytes x var val 0 for var i 0 i lt x length i val x i if i lt x length 1 val val lt lt 8 return val func
  • 如何获取 UIWebView 中元素的位置?

    我在 iPad 程序中加载了 html 的 UIWebView 通过使用 webkit column width 我将 html 分为几列 padding 0px height 1024px webkit column gap 0px we
  • 数据表日期范围过滤器

    如何添加日期范围过滤器 like From To 我开始进行常规搜索和分页等工作 但我不知道如何制作日期范围过滤器 我正在使用数据表 1 10 11 版本 My code var oTable function callFilesTable
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas

随机推荐