video.textTracks是只读TextTrackList,轨道须通过标签或addTextTrack()创建;mode仅disabled/hidden/showing三态,设showing需用户首次启用、readyState为2且同kind唯一激活。

video.textTracks 返回的是只读列表,不能直接增删轨道
你拿到的 video.textTracks 是一个 TextTrackList 对象,它看起来像数组(支持索引访问、length、getTrackById()),但没有 add()、remove() 或 switchTo() 方法。轨道只能通过 HTML 的 标签声明,或用 video.addTextTrack() 动态创建——之后就只能读取和监听变化。
常见错误现象:试图写 video.textTracks.push(track) 或 video.textTracks[0] = newTrack,结果静默失败,控制台无报错,textTracks.length 也不变。
- 轨道注入时机很关键:
必须是的**直接子元素**,且必须放在所有之后、之前 - 用 JS 动态
appendChild()到已渲染的内部?无效。浏览器不会重新扫描 - 多个
之间插了注释或空行?Safari 可能中断后续解析
TextTrack.mode 只有三个合法值,且行为差异极大
mode 不是开关按钮,而是三态控制器,每个值触发完全不同的底层行为:
-
"disabled":默认值。轨道不加载、不解析、不触发任何事件,内存里几乎不占资源 -
"hidden":轨道会加载并解析(包括 WebVTT 时间戳校验、文本解码),但不渲染、不显示。适合预加载或做语言检测 -
"showing":唯一能显示内容的模式。但前提是该轨道已被用户“启用”过(即在右键菜单里手动勾选过一次);否则即使设了也无效
性能影响明显:"hidden" 比 "disabled" 多出完整解析开销,尤其对长字幕文件;而 "showing" 还要叠加渲染管线压力。别为了“提前准备”把所有字幕都设成 "hidden"。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
设置 mode = 'showing' 失败的五个典型原因
你写了 track.mode = 'showing' 却没看到字幕?大概率卡在这几个环节:
- 轨道还没加载完成:
track.readyState !== 2(2表示LOADED)。应监听track.onload或轮询readyState - 用户从未在 UI 中启用过该轨道:浏览器强制要求“首次启用必须由用户手势触发”,硬设无效。得先确保对应
带default属性,或引导用户点一次菜单 -
kind不匹配:比如想切字幕却遍历了所有kind === 'descriptions'的轨道 - 同 kind 类型存在多条激活轨道:浏览器只允许一条
subtitles处于"showing",其余自动降为"disabled"。需手动关掉前一个再开新的 - CORS 或 MIME 问题导致轨道根本没进
textTracks列表:检查video.textTracks.length是否符合预期,而不是直接操作
动态切换字幕时必须手动管理 mode 状态
浏览器不会帮你做“单选互斥”。例如你有中/英/日三条 subtitles 轨道,想切到日语,不能只设 jaTrack.mode = 'showing' —— 中文和英文轨道仍保持 "showing" 的话,实际渲染可能混乱或被忽略。
正确做法是显式关闭其他同类轨道:
track.readyState === 2
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










