optgroup 和 track 的 label 属性均不可为空或省略,必须为有意义的纯文本;前者用于 select 分组标题且需手动更新,后者仅在特定 kind 下生效且替换需重载 dom。

optgroup 的 label 属性是分组标题,不可省略或为空
浏览器渲染 <optgroup></optgroup> 时,label 是唯一用于显示分组名称的属性,它不参与表单提交,也不影响选项值。如果漏写 label 或设为空字符串(label=""),Chrome 和 Firefox 会显示一个空白分组项(视觉异常),Safari 可能直接跳过该 <optgroup></optgroup> 或报 DOM 解析警告。
实操建议:
-
label值应为有意义的中文/英文短语,如label="国内城市",避免用空格、或纯符号替代 - 不要试图用 CSS 的
::before伪造 label —— 屏幕阅读器无法识别,违反可访问性要求 - 动态生成时注意转义:若 label 来自用户输入,需对
、<code>>、"做 HTML 实体编码,否则破坏结构
track 的 label 属性仅在 kind="subtitles" 或 "captions" 时生效
<track></track> 的 label 不是装饰性字段,而是用户选择字幕/描述轨道时的可见名称。它只在 kind 为 subtitles、captions、descriptions 时被 UI 使用;若 kind="metadata" 或 "chapters",浏览器完全忽略 label,也不会显示在轨道菜单中。
常见错误现象:
- 写了
label="English"但kind="metadata"→ 字幕开关里根本看不到这项 - 多个
<track></track>的label相同(如都写label="中文")→ 浏览器可能只显示第一个,其余被静默去重 - label 含非法字符(如
/、\0)或超长(>100 字符)→ 部分旧版 Edge 渲染截断,iOS Safari 可能拒绝加载该 track
两者 label 都不支持 HTML 内容,且无对应 JS 属性映射
无论是 <optgroup label="..."></optgroup> 还是 <track label="..."></track>,label 始终被当作纯文本处理。你不能在里面写 <span></span>、用 style 行内样式,也不能靠 element.label 在 JS 中读取 —— <optgroup></optgroup> 元素没有 label 属性的 DOM 对应字段,必须用 getAttribute('label');<track></track> 虽有 track.label 属性,但它只在 track 加载完成(onload 触发后)才可用,初始为 "" 或 undefined。
性能提示:
- 频繁调用
optgroup.getAttribute('label')不会有性能问题,但别在循环中反复查同一个节点 - 监听
video.textTracks时,不要假设track.label已就绪 —— 应等待track.mode !== 'disabled'且track.kind有效后再取值
国际化场景下,label 不能靠 lang 属性自动切换
<optgroup label="Cities"></optgroup> 和 <track label="English Subtitles"></track> 的 label 值都是静态字符串,不会根据页面 lang 或用户系统语言变化。想实现多语言,必须手动切换 DOM:optgroup.setAttribute('label', localizedLabel) 或替换整个 <track></track> 元素(因为 track.label 是只读的)。
容易被忽略的细节:
-
<optgroup></optgroup>的label切换后,已展开的<select></select>下拉框不会实时更新 —— 用户需收起再点开才能看到新文字 -
<track></track>的label替换必须先remove()原元素,再append()新的,直接改setAttribute无效 - 服务端渲染时若依赖 i18n 上下文填
label,需确保与客户端 locale 完全一致,否则 hydration 会出错










