【发布时间】:2020-01-22 22:32:45
【问题描述】:
我目前正在使用 Svelte 构建自定义 Web 组件库。
我已经完成了一个选择选项下拉组件,它可以接受嵌套的、开槽的内容来组成下拉选项。它对鼠标用户没有任何已知问题,并且可以这样实现:
<custom-select label="My Custom Select Element">
<custom-option value="1">Option 1</custom-option>
<custom-option value="2">Option 2</custom-option>
<custom-option value="3">Option 3</custom-option>
</custom-select>
我现在正在研究组件的可访问性,并且需要实现“陷阱焦点”。在不涉及实现陷阱焦点的各种方法的情况下,我试图完成一个简单的测试,将焦点分配给父组件中的一个开槽元素。开槽的元素都有 tabindex="0" ,我可以毫无问题地通过它们。
我可以使用 Svelte 中的绑定成功地“抓取”我想要聚焦的元素。虽然您不能直接在 slot 元素上放置绑定指令(您 可以 在 slot 上放置属性),但我能够像这样绑定到父 span 标签:
<span bind:this={slotObj}>
<slot />
</span>
然后,我可以使用一些 JavaScript 深入到绑定的父级,并将开槽的元素分配给一个名为“选项”的对象:
let slot = slotObj.children[0];
options = slot.assignedElements();
如果我要控制台记录选项对象中的第一个元素,我会看到一个预期的:
console.log(options[0]); // <custom-option value="1">Option 1</custom-option>
我还可以成功修改选项对象中元素的属性,并查看 DOM 中的变化。因此,在“抓取”开槽元素并更改其属性时没有问题。但是,以下内容将不在父组件内工作以聚焦开槽元素:
options[0].focus();
这不会引发任何错误,它只是没有做任何我能够辨别的事情。如前所述,我可以通过选项卡进行选项卡,因此它们能够在常规选项卡场景中接收焦点。只有通过 JavaScript,我似乎无法分配焦点。
在处理自定义 Web 元素和插槽内容时,任何 Svelte 特定建议和/或一般建议将不胜感激。非常感谢。
【问题讨论】:
-
您可以将代码放入 REPL 中吗? svelte.dev/repl
标签: focus web-component shadow-dom svelte slot