track是空元素,无内部内容可清空;真正控制字幕显示需设置video.textTracks[i].mode='disabled'或更新src后调用video.load()。

track 元素本身不能被“清空内容”
track 是一个自闭合的空元素(void element),没有子节点,也不支持 innerHTML 或 textContent。你看到的字幕、章节等“内容”,其实来自它的 src 属性指向的外部 WebVTT 文件,不是写在 HTML 标签里的。所以不存在“清空 track 标签内部文字”的操作——它本来就没有内部文字。
想让视频不显示字幕,该操作 video 元素而非 track
实际效果上,“清空字幕”真正要控制的是 video 的字幕轨道启用状态,而不是删掉或清空 track 标签本身:
- 设置
video.textTracks[0].mode = 'disabled'可关闭指定轨道(注意:textTracks是只读类数组,不能增删) - 调用
video.disableRemotePlayback = true不相关,别混淆 - 如果多个
track,需遍历video.textTracks并逐个设mode = 'disabled' - 直接移除 DOM 中的
track元素(如track.remove())也能生效,但属于副作用操作,不推荐作为首选
动态替换字幕源时,必须重新加载 video
修改 track.src 后,浏览器不会自动重载字幕文件。常见错误是只改了属性却没触发更新:
- 必须先设
track.mode = 'disabled' - 再改
track.src = 'new.vtt' - 最后调用
video.load()(这会重载整个媒体资源,包括新字幕) - 或者更轻量的做法:先
track.remove(),再video.appendChild(newTrack),然后video.textTracks[...].mode = 'showing' - 注意:WebVTT 文件需符合 CORS,否则加载失败且静默无提示
服务端返回空 VTT 文件 ≠ 清空字幕
有些同学尝试让后端返回空的 .vtt 文件(比如只有 WEBVTT 头),结果发现字幕仍残留或报错。这是因为:
- 浏览器缓存了旧的 VTT 解析结果,需加时间戳参数(如
src="sub.vtt?t=123")强制刷新 - 空 VTT 文件若缺少合法格式(如缺空行、缺头),会被解析失败,
track.readyState会卡在0(NOT_LOADED) - 检查
track.error属性可获具体错误,例如NetworkError或DecodeError
mode,或换掉 src 后重载;所有试图操作 track 内部 HTML 内容的思路,从一开始就是错的。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











