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

