📅  最后修改于: 2023-12-03 15:35:11.585000             🧑  作者: Mango
在 SVG 中,事件传播需要通过该元素的包含树进行。由于 SVG 可以嵌套,所以 SVG 中的事件传播不同于 HTML。为了解决 SVG 中的事件传播,开发者引入了 Event.composed
属性。
composed
属性是一个只读属性,指示事件是否会穿过阴影DOM树的 ShadowRoot 端口,传到上层节点。这个属性默认为 false
,意味着事件不会到达阴影DOM树中的子节点。
例如,在下面的代码块中,当用户点击 SVG 路径时,事件被传递给父元素,元素标记为 shadow-root
的子元素被忽略:
<body>
<x-foo>
#shadow-root
<svg>
<path fill="#ff0000" d="M25.086 97.01a8.1 8.1 0 1 1 8.1-8.1 8.1 8.1 0 0 1-8.1 8.1z"></path>
</svg>
</x-foo>
<script>
class XFoo extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.innerHTML = `<slot></slot>`;
this.shadowRoot.querySelector('slot').addEventListener('click', (ev) => {
console.log(ev.composed);
});
}
}
customElements.define('x-foo', XFoo);
</script>
</body>
在上面的代码块中,如果将 composed
属性设置为 true
,那么 console.log
就会触发,因为 click
事件已经到达了 path
元素。
在 SVG 中,事件传播不同于 HTML。通过使用 Event.composed
属性,可以提高事件传播的灵活性和可控性,特别是在嵌套的 SVG 中。