audio元素默认不支持后退10秒,需用javascript安全设置currenttime=math.max(0, currenttime-10),并监听loadedmetadata/canplay事件确保音频就绪。

audio 元素默认不支持后退十秒,得靠 JavaScript 控制 currentTime
HTML 的 <audio></audio> 标签本身只提供基础播放控制(play、pause),没有内置“后退10秒”按钮。必须用 JS 读取并修改 currentTime 属性——它代表当前播放位置(单位:秒),可读可写。
常见错误是直接写 audio.currentTime -= 10 却不检查边界,导致负值或跳过开头。实际使用时要注意:
-
currentTime设置负数会抛错:DOMException: The provided double value is non-finite. - 设置超过
duration的值不会报错,但播放器会自动截断到末尾 - 某些浏览器(如旧版 Safari)在音频未加载完成时读
duration会返回NaN,需等loadedmetadata事件
绑定按钮点击事件,安全执行 -10 秒逻辑
最简可行方案:加一个按钮,点击时获取当前时间、减10、再写回。关键在“安全”——避免负值、避免操作未就绪的音频。
示例代码(内联写法,可直接嵌入 HTML):
<audio id="myAudio" src="sound.mp3" controls></audio><button onclick="skipBack()">◀◀ 10s</button>
<p><script>
function skipBack() {
const audio = document.getElementById('myAudio');
// 确保已加载元数据,否则 duration 可能为 NaN
if (isNaN(audio.duration)) return;
// 防负值:取 max(0, 当前时间 - 10)
audio.currentTime = Math.max(0, audio.currentTime - 10);
}
</script></p>
注意点:
- 不要用
audio.currentTime--或-= 10后不校验,尤其在快进/快退频繁时容易越界 - 如果音频是流式加载(如网络地址),首次点击可能因未缓冲而跳转不准,可加
canplay监听提升可靠性 - 移动端需注意:iOS Safari 要求用户手势触发播放,所以后退按钮也必须由 click/tap 触发,不能 onload 自动调用
想用键盘快捷键(如 ← 方向键)?得监听 keydown 并限定目标
用户习惯用方向键控制,但全局监听 keydown 很危险——比如在输入框里按 ← 不该触发后退。必须加条件过滤:
- 只在
audio元素聚焦时响应(audio.hasFocus()),或 - 监听整个页面,但排除
input、textarea、contenteditable等可编辑元素
片段示例:
document.addEventListener('keydown', (e) => {
if (e.key === 'ArrowLeft' &&
!['INPUT', 'TEXTAREA'].includes(e.target.tagName) &&
document.getElementById('myAudio').paused === false) {
const audio = document.getElementById('myAudio');
audio.currentTime = Math.max(0, audio.currentTime - 10);
}
});
容易被忽略的是:键盘事件默认可重复触发(长按方向键会连续跳),若要防抖,得加 setTimeout + clearTimeout 控制最小间隔。
移动端真机测试常卡在 autoplay 和 touch 响应上
iOS 和 Android 对音频自动播放限制极严,哪怕只是想让按钮点击后立刻后退,也依赖音频已处于“可播放状态”。常见表现:
- 第一次点击按钮没反应 → 实际是音频还没真正加载,
currentTime写入无效 - 触摸事件没触发 → 没给按钮加
touchstart或没阻止默认行为(尤其在fastclick类库环境下) - 后退后声音卡顿 → 因为移动浏览器对非用户手势触发的
currentTime修改有延迟或丢帧
对策:
- 在
canplay或loadeddata事件后才启用按钮(button.disabled = false) - 按钮同时绑定
click和touchstart,且touchstart中加e.preventDefault() - 避免在
timeupdate频繁回调里做计算,后退逻辑只走用户主动触发路径
真实项目里,最麻烦的往往不是写那三行 JS,而是音频资源加载时机、跨端 focus 状态判断、以及用户手速比代码还快带来的竞态问题。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











