列表里的视频卡片时长全是 00:00,点进去播放才变成 03:42,刷新列表又回到 00:00。乍看像缓存或者权限的锅,追下去往往不是。
video.addEventListener('loadedmetadata', () => {
const d = Number.isFinite(video.duration) ? video.duration : 0;
label.textContent = format(d);
});
追下去是这么回事:时长要等 loadedmetadata 事件之后才能读,代码在 DOM 就绪时就取了 duration,那时还是 NaN。部分浏览器返回 Infinity,直接格式化就成了 00:00。
碰到「视频时长未加载」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。
监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
具体做法是,把取值挂到 loadedmetadata 上 不要写在初始化里;用 Number.isFinite 判断后再格式化;列表页只取元数据 preload=metadata 省流量。
验收就看一点,列表里的时长在 1 秒内显示为 03:42,与播放器里读到的一致。
