我想使用当前的 Web 组件规范实现一个列表框小部件。此外,生成的列表框应符合 ARIA 标准。实例化列表框小部件应该很简单:
<x-listbox>
<x-option>Option 1</x-option>
<x-option>Option 2</x-option>
</x-listbox>
出于清洁和封装的目的,其他一切都应该在 shadow dom 中渲染。为了实现这个小部件,注册了两个自定义<x-listbox>
元素<x-option>
。shadow dom 的顶级元素<x-listbox>
是 a <div>
,它带有role=listbox
和aria-activedescendent
可访问性的属性(我不希望<x-listbox>
元素上有这些属性,因为它们是实现细节。)
为了aria-activedescendent
工作,需要选项元素上的 id。将 id 直接放在<x-option>
元素上不会起作用,原因有两个:首先,它会污染使用列表框小部件的文档的 id 命名空间。其次,更重要的是,id 不能跨影子边界工作(这是影子 dom 的目的之一),因此选项的 id 必须<div>
与aria-activedescendent
属性位于相同的影子 dom 中。
一个解决方案是用另一个(属于那个shadow dom)包围<x-option>
作为内容呈现在shadow dom中的每个,在其上可以放置一个id。<x-listbox>
<div>
我的问题是:这是正确的方法吗?如何使用自定义元素和 shadow dom web api 来实现它?