track元素的default属性仅在页面加载时生效,动态设置无效;启用字幕必须通过video.texttracks[n].mode = "showing"操作,且多个字幕轨道同时设为showing时仅首个渲染。

track元素的default属性不生效的常见原因
浏览器只在页面加载时检查default属性是否存在(值是否为真),之后动态添加或通过JS设置default属性**不会触发字幕自动启用**。即使你用track.setAttribute('default', ''),<track></track>也不会被激活——这是规范行为,不是bug。
用JS强制启用某个track的正确方式
必须操作video.textTracks集合,而不是DOM属性。每个TextTrack对象有mode属性,设为"showing"才真正显示字幕:
-
video.textTracks[n].mode = "showing"是唯一可靠的启用方式 - 需确保
textTracks已就绪:监听load事件或检查readyState === 2 - 多个
track元素对应多个TextTrack,索引不一定与HTML顺序一致,建议用kind和srclang筛选
video.addEventListener('loadedmetadata', () => {
for (let track of video.textTracks) {
if (track.kind === 'subtitles' && track.language === 'zh') {
track.mode = 'showing';
break;
}
}
});
动态插入track后怎么立即启用
用video.addTextTrack()创建的轨道默认mode = "disabled",且没有default属性可写。必须手动设mode:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
-
addTextTrack()返回TextTrack对象,可直接赋值mode - 如果track是后来用
appendChild()插入的,要等textTracks更新,可用setTimeout微任务或MutationObserver监听 - 注意:Safari对动态插入
<track></track>的load事件支持不稳定,优先走textTracks遍历
const track = video.addTextTrack('subtitles', 'Chinese', 'zh');
track.mode = 'showing'; // 立即生效
// 后续可调用 track.addCue() 添加字幕
为什么document.querySelector('track').default = true没用
DOM上的default属性只是初始声明,不绑定到TextTrack.mode。浏览器解析HTML时读取该属性并设置对应TextTrack的初始mode,之后两者完全解耦:
- 修改
track.default属性 →TextTrack.mode不变 - 修改
TextTrack.mode→track.default属性值也不变 - 想“模拟default效果”,只能主动设
mode = "showing",并确保其他track设为"disabled"
最易忽略的一点:多个subtitles轨道同时设mode = "showing"时,只有第一个会实际渲染——浏览器只显示一个active track,这点连textTracks API文档都没明说。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










