kind 是 标签中决定轨道语义与行为的核心属性,必须为合法值“subtitles”“captions”或“descriptions”,错误拼写、留空或误用其他值将导致浏览器静默忽略整条轨道。

kind 是 <track></track> 标签里决定轨道语义和行为的核心属性,不是可有可无的装饰项。设错或省略,浏览器直接忽略整条轨道——字幕不显示、菜单不出现、JS 也查不到。
kind 必须是明确的合法值,不能拼错或留空
浏览器只认三个标准值:"subtitles"、"captions"、"descriptions"。常见错误包括:
- 写成
"subtitle"(少 s)或"subtitiles"(拼错),全被静默丢弃 - 用
kind=""或完全不写kind属性,轨道不会注册到video.textTracks - 误用
"chapters"或"metadata"来“凑数”,它们用途完全不同(章节导航 / 自定义数据),不会触发字幕渲染
实际选哪个,取决于内容意图:
-
kind="subtitles":纯对话翻译,面向听懂语音但需文字辅助的用户(如外语视频) -
kind="captions":含声音描述的隐藏式字幕(如 [音乐起]、[电话铃响]),主要服务听障用户;播放器 UI 中常标为 “CC” -
kind="descriptions":音频描述轨道,供屏幕阅读器读出画面信息,不显示在视频上
kind 和 srclang、label 必须协同使用,不能孤立配置
kind 单独正确还不够。浏览器在构建字幕菜单、匹配用户系统语言、响应 JS 切换时,依赖三者组合:
-
srclang是唯一用于 JS 定位轨道的依据,比如video.textTracks[0].srclang === "zh";写成"zh-CN"或"ch"都可能导致getKind()匹配失败 -
label是用户看到的名字,缺失时菜单里只显示 “字幕” 或 “CC”,无法区分中/英/日;建议写具体,如label="中文(简体)" - 同一
kind下多个轨道(如两个kind="subtitles"),必须靠srclang+label唯一识别,否则 JS 切换逻辑会混乱
移动端 Safari 对 kind 的处理最严格,且不尊重 default
iOS/iPadOS Safari 会加载 <track></track> 并暴露进 textTracks,但:
- 即使写了
default,也不会自动启用任何轨道——track.mode默认是"disabled" - 原生字幕按钮默认隐藏,用户根本看不到菜单;必须自己用 JS 拉取
textTracks渲染 UI,并手动设track.mode = "showing" - 如果
kind不是"subtitles"或"captions",Safari 直接跳过加载(连onload都不触发)
测试时别只看 Chrome:真机打开 DevTools 连接 Safari,检查 video.textTracks.length 是否为预期值,再确认 track.kind 和 track.srclang 字段是否真实存在。
JS 动态控制字幕前,必须等 track.readyState === 2
直接对 track.mode 赋值 "showing" 很可能无效,因为 VTT 文件还没加载完。浏览器不会阻塞执行等你,而是跳过设置。
- 可靠做法是监听
track.onload,或轮询track.readyState—— 只有等于TextTrack.LOADED(即数值2)才安全操作 - 切换时记得先关掉同
kind的其他轨道:otherTrack.mode = "disabled",否则可能多轨叠加显示 - 禁用所有字幕?别只设
mode = "disabled",更稳妥是遍历textTracks,对每个kind === "subtitles"的轨道都设一次
真正容易被忽略的点是:VTT 文件加载失败时,track.error 可能为 null,readyState 卡在 0(TextTrack.NONE),而控制台不报错——得靠主动检查状态码和网络面板确认 .vtt 是否返回了 200 和 Content-Type: text/vtt。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











