loop是布尔属性,仅存在即启用,不可赋值;JS控制需直接操作audio.loop属性;iOS Safari等存在兼容性问题,需用ended事件或video标签绕过;autoplay需配合muted才有效。

loop 属性是布尔属性,直接写上就生效
HTML 的 loop 属性没有值,不是 loop="true" 或 loop="1" 这类写法。只要在 <audio> 标签里出现 loop,浏览器就会开启循环播放。
常见错误包括:
- 写成
<audio loop="true">—— 浏览器会忽略该值,但多数情况下仍能循环(靠布尔属性隐式转换),属于冗余且不规范 - 写成
<audio loop="false">—— 这不会禁用循环,反而会启用(因为只要存在该属性名,即视为 true) - 试图用 JS 动态设为
audio.loop = false却没生效 —— 可能是 DOM 未加载完成或元素被重复初始化
JS 控制 loop 需要操作元素的 loop 属性而非 dataset
通过 JavaScript 开关循环时,必须直接读写 loop 属性,而不是 dataset 或 setAttribute 模拟布尔行为。
正确做法:
立即学习“前端免费学习笔记(深入)”;
const audio = document.querySelector('audio');
audio.loop = true; // 启用
audio.loop = false; // 禁用
错误写法示例:
-
audio.setAttribute('loop', 'true')—— 多余,且无法关闭 -
audio.dataset.loop = 'false'—— 完全无效,dataset不影响原生布尔属性 -
audio.loop = 'false'—— 字符串会被转为 true,实际仍循环
loop 在部分 iOS Safari 和旧 Android WebView 中不生效
这是真实存在的兼容性问题:iOS Safari(尤其 iOS 10–15)对 <audio> 的 loop 支持不稳定,常表现为只播一次就暂停,即使 DOM 属性显示为 true。
绕过方法有限,但可尝试:
- 监听
ended事件后手动play()(需用户手势触发上下文,否则被静音策略拦截) - 改用
<video>标签配合mute+loop—— iOS 对 video 的 loop 支持更可靠 - 避免依赖自动 loop,改由 JS 精确控制播放位置和重播时机(例如用
currentTime = 0+play())
loop 和 autoplay 同时使用时要注意静音策略
Chrome、Safari、Firefox 等现代浏览器默认禁止有声音的自动播放。如果写了 autoplay 和 loop,但没加 muted,音频大概率不会启动,自然也谈不上循环。
可行组合:
-
<audio autoplay muted loop>—— 无声音,可自动循环 -
<audio loop>+ 用户点击后调用play()—— 有声音,可循环 - 避免
<audio autoplay loop>(无 muted)—— 几乎肯定失败,控制台可能报DOMException: play() failed because the user didn't interact with the document first.
loop 本身不触发播放,它只在音频自然结束或被 JS 调用 play() 后起作用。没人点一下,它就一直安静地待着。



















