如何阻止闭合Shadow Root内的事件向外泄漏?
阻止闭合Shadow Root事件向外泄漏的可靠高效方案?
我有一个承载敏感信息自定义控件的闭合Shadow Root,即便处于闭合状态,事件仍会从Shadow Root冒泡到外部DOM(仅在离开时移除Shadow Root路径)。这会导致闭合Shadow DOM中的信息泄漏到宿主文档,甚至可能被用于对沙箱化DOM进行按键记录。
Event对象有一个Event.composed只读属性,定义为:
Event接口的只读属性
composed返回布尔值,表示事件是否会跨Shadow DOM边界传播到标准DOM中。
这正是我需要的功能,但该属性为只读,无法直接修改利用。
已尝试的方案
- 删除
Event.prototype.composed并替换为返回false的getter。 - 在Shadow Root的宿主元素上添加事件处理器终止事件,但无论如何尝试,要么
document.addEventListener("keydown", e => console.log(e), true);会捕获到泄漏事件,要么过早终止事件导致其他逻辑无法触发。
考虑尝试的方案
- 劫持
EventTarget.addEventListener方法,将每个回调包裹在沙箱代码中以拒绝试图逃离Shadow Root的事件,但无法确保在所有环境中生效。 - 劫持所有事件并重新触发,将
composed标记设为false,或转为自定义事件,但这会在鼠标或陀螺仪事件上造成性能损耗。 - 使用iframe替代Shadow Root,但宿主文档仍为其所有者,无法确保效果。
请问在JavaScript中是否存在可靠且高效的方法来阻止闭合Shadow Root内的事件向外泄漏?
内容的提问来源于stack exchange,提问作者Prime
相关产品推荐
相关产品推荐

