You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FireFox中Shadow DOM鼠标CLICK事件无法冒泡至Light DOM问题

问题描述

文档说明,触发Web Component中Shadow DOM元素的事件应从Shadow DOM传递至Light DOM,且target、currentTarget、originalTarget等会被映射为Web Component的tagName、id等。

但在测试场景中,FireFox并未出现该行为。

在测试页面中,我希望能收到disTick复选框的click事件通知,以便禁用Toggle:

document.getElementById("disTick").addEventListener("click", (e) => {
    if (e.target.checked)
        myToggle.disabled = true;
    else
        myToggle.disabled = false;
});

document.body.addEventListener("change", (e) => { console.log("****" + e.target.tagName); });

该事件在Chrome、Edge、Opera中会被触发,但在FireFox中不会。

(我尝试在body上捕获click、input和change事件,但均未冒泡。)

奇怪的是,我生成的合成事件可以正常冒泡(来自toggle.js):

this.#toggle.addEventListener('keyup', (e) => {
    if (e.altKey || e.ctrlKey || e.isComposing || e.metaKey || e.shiftKey)
        return;
    
    if (e.keyCode == 32 || e.keyCode == 13)
    {
        console.log("key = " + e.keyCode);
        e.preventDefault();
        this.#toggle.click();   
    }
});

我遗漏了什么?为什么FireFox中原生点击事件无法冒泡至Light DOM?


编辑1

FireFox实际上确实会将事件冒泡至Light DOM,但那是input事件而非click事件,这是为什么?


编辑2

补充信息:Chrome会按顺序触发click和input事件。FireFox在空格键/合成事件上的表现与之一致,但鼠标点击时不会向Light DOM传递click事件。

目前测试示例在FireFox和Chrome中均可正常运行TickBox和Toggle,但空格键/回车键功能仍无法正常工作,我还在排查。


编辑3

好吧,我之前犯了个错!居然不知道空格键本身就是一个原生点击事件:-(


编辑4

希望这些补充信息能明确问题:

  • FireFox会将我通过空格键/回车键生成的合成click事件冒泡,但不会将鼠标触发的原生click事件冒泡。
  • Chrome、Opera和Edge的表现符合预期(两种事件均会冒泡)。
  • 所有浏览器都会对鼠标点击和合成点击触发的input事件进行冒泡。
  • 两种事件均具备composed、cancelable和bubbles特性。
  • 我发现的唯一区别是:合成click事件的target被设置为ABC-TOGGLE#myToggle,而鼠标click事件的target仍是input复选框。

注:我知道空格键原本是复选框的标准click事件触发方式,但为了与Chrome保持一致性,我调用了stopPropagation()。

为什么鼠标触发的click事件无法在DOM间传递?


内容的提问来源于stack exchange,提问作者McMurphy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:47:38