video.textTracks 为空或 mode 无效,主因是 track 未通过浏览器校验(kind/srclang/label/位置错误)、未加载元数据、VTT MIME 类型非 text/vtt、编码非 UTF-8 无 BOM 或 src 不可达。

video.textTracks 里没有字幕?先确认 track 是否被浏览器识别
不是所有写进 HTML 的 都能进 video.textTracks 列表——浏览器会静默忽略结构或属性错误的 track。常见原因包括:kind 拼错(比如写成 "subtitle")、srclang 用非法值(如 "ch" 或空字符串)、label 缺失、 放在 前面,或夹在注释/空行之间。只有通过这四关的 track 才会出现在 video.textTracks 中,否则你调 track.mode = "disabled" 都没对象可操作。
关闭字幕不是设 mode = "disabled" 就完事
track.mode 只控制单个轨道的显示状态,但用户手动切换后,浏览器可能保留选择并覆盖 JS 设置。真正可靠的关闭方式是遍历全部轨道并统一禁用:
const video = document.querySelector('video');
video.textTracks.forEach(track => {
if (track.kind === 'subtitles') {
track.mode = 'disabled';
}
});
- 必须在
video元素已加载元数据后执行(监听loadedmetadata事件),否则textTracks可能为空 - 不要只改一个 track;多个
并存时,只关一个会导致其他仍生效 - Safari 对
mode更敏感,设为"disabled"后需确保没其他 track 处于"showing"状态,否则右键菜单仍显示“已启用”
想彻底隐藏字幕菜单?不能只靠 JS
关闭字幕 ≠ 隐藏字幕开关。Chrome 和 Edge 默认显示右键「字幕」菜单项,但 Safari 不会——除非至少有一个 带 default 属性。所以,若你希望 UI 上完全不出现字幕入口:
- HTML 中一个
也不加default(哪怕有多个) - JS 初始化时主动设所有 subtitles 轨道为
mode = "disabled" - 但注意:这样用户就无法手动开启,且部分安卓 WebView 会强制显示空菜单项——这不是 bug,是规范行为
为什么调了 mode 却没反应?检查三个硬性前提
即使代码写对,track.mode 也可能无效,因为浏览器根本不让改:
-
src必须是可访问 URL,Blob URL 或file://路径下 track 根本不会加载,textTracks里就没有它 - VTT 文件返回的 MIME 类型必须是
text/vtt,Nginx/Apache 未配置时 Safari 直接跳过解析 - 文件编码必须是 UTF-8 无 BOM,VS Code 右下角点「Save with Encoding」选 UTF-8,别信默认
这些条件任意一条不满足,track 就像没存在过——你对着 undefined 调 mode,自然没效果。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











