HTML5没有html5play函数,实际是原生play()方法返回Promise,失败时reject出DOMException,其name属性(如NotAllowedError)标识错误类型,应通过try/catch或.catch()捕获并判断name而非code或数字码。

html5play 函数根本不存在,别再搜了
HTML5 没有叫 html5play 的函数。这是常见误传,往往源于混淆了原生 HTMLMediaElement 方法(如 play())与某些封装库(比如旧版 video.js、百度播放器 SDK 或自研工具函数)的私有命名。直接搜索“html5play 失败码”会找不到标准依据,也查不到权威文档。
真正触发失败的是 play() 方法,错误在 Promise reject 里
现代浏览器中,调用 video.play() 或 audio.play() 返回一个 Promise。播放失败时,Promise 被 reject,其 reason 是一个 DOMException 实例,name 属性即为实际错误类型:
-
"NotAllowedError":最常见,用户未与页面交互(如点击)就自动调用play(),浏览器阻止静音/非静音自动播放 -
"NotSupportedError":媒体资源格式不被支持(如 Safari 播放 .webm)、或源地址 404/跨域且无 CORS -
"AbortError":加载过程中调用了load()或src被重设,中断了当前播放流程 -
"DecodeError":文件损坏、编码参数非法(如 H.264 profile 不兼容),解码器报错
注意:code 属性(如 reason.code === 1)已废弃,不要依赖;只看 reason.name。
如何稳定捕获并区分这些失败?
必须用 try/catch 包裹 await,或用 .catch() —— 不能只监听 error 事件,它不覆盖 Promise reject:
立即学习“前端免费学习笔记(深入)”;
const video = document.querySelector('video');
async function safePlay() {
try {
await video.play();
console.log('播放成功');
} catch (err) {
if (err.name === 'NotAllowedError') {
console.warn('需用户手势触发,比如监听 click 后再 play');
} else if (err.name === 'NotSupportedError') {
console.error('格式不支持或资源不可达');
} else if (err.name === 'DecodeError') {
console.error('视频文件可能损坏');
}
}
}
补充要点:
- 确保
video已插入 DOM 且src已设置,否则play()会立即 reject - 移动端 iOS Safari 对自动播放限制极严,即使有声音也常需用户点击后才允许
- 部分安卓 WebView(尤其旧版)不返回标准
DOMException,而是字符串 error,需降级判断typeof err === 'string'
所谓“状态码”其实是浏览器实现细节,别硬映射
有些文章列出 “-1、101、200” 等数字码,它们来自特定播放器 SDK(如腾讯云 VOD Web SDK 的 player.play()),不是 HTML5 标准。如果你看到这类码,先确认你用的到底是不是原生 —— 查看控制台是否调用了自定义对象的 play 方法,而不是 HTMLVideoElement.prototype.play。
真正要调试,打开 DevTools → Network 查看媒体请求是否 200;Elements 面板检查 元素是否有 networkState(0=EMPTY, 1=IDLE, 2=LOADING, 3=HAVE_ENOUGH_DATA)和 readyState(0=HAVE_NOTHING 等),比猜状态码更可靠。










