【发布时间】:2019-09-25 03:49:10
【问题描述】:
tl;博士:
- 两个元素具有相同的 ID 属性是否有效,只要它们位于不同的影子根下?
- 屏幕阅读器会在这种情况下正确处理
aria-labelledby吗?
例如,考虑这个自定义元素:
(function () {
let template = document.createElement('template')
template.innerHTML = `
<svg viewBox="0 0 206 74"
fill="none"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="logo-title">
<title id="logo-title"><slot>Logo of Some Company.</slot></title>
<path d="..." fill="..."/>
</svg>
`
class Logo extends HTMLElement {
constructor () {
super()
let shadowRoot = this.attachShadow({mode: 'open'})
shadowRoot.appendChild(template.content.cloneNode(true))
}
}
customElements.define('company-logo', Logo)
})()
这样做是否有效:
<company-logo>
Title One.
</company-logo>
<company-logo>
Some other title.
</company-logo>
这是否是一个有效的 DOM,即使 <title> 共享相同的 ID?屏幕阅读器是否会为第一个徽标读取“Title One”,而为第二个徽标读取“Some other title”?
【问题讨论】:
-
我不确定,但我的猜测是否定的。 ID 的点是唯一标识符。如果您想通过 ID 选择其中之一,您如何知道目标是哪一个?
-
@ChrisBarr
querySelector或getElementById不要跨越阴影根边界,所以这应该不是问题,不是吗? -
我想不是,但为什么还要有相同的 ID 呢?似乎至少让开发人员感到困惑已经成熟了。为什么不让ID带有随机后缀?喜欢
id="logo-title-${Math.random().toString(36).substr(2, 8)}" -
我只是想知道它是否合法并且处理得当。在规范中找不到任何明确提及此案例的内容。
-
好吧,我也不知道,但是使用真正唯一的 ID 不会有什么坏处。此外,您可以尝试使用屏幕阅读器,看看它是否有效 - 下载 ChromeVox 扩展程序,它非常易于使用。
标签: html accessibility shadow-dom custom-element