video标签不支持onpause属性,需用addeventlistener('pause',...)监听;暂停原因多样,应结合readystate、currenttime和ended判断是否触发广告;广告须用dom浮层实现,避免alert阻塞,并适配移动端自动播放限制。

video 标签没有 onpause 属性
直接写 onpause 是无效的,HTML 原生 <video></video> 不支持这个属性。它只认标准事件监听方式,比如 addEventListener('pause', ...) 或内联 onpause(但注意:这是 JavaScript 事件处理属性,不是 HTML 自定义属性)。
如果你在标签里写了 <video onpause="showAd()"></video>,浏览器会把它当作文本属性存着,根本不会触发——除非你手动用 JS 绑定,否则它只是个无意义字符串。
正确监听 pause 事件并显示广告
必须用 JS 监听 pause 事件,再调用广告展示逻辑。关键点在于:暂停未必等于用户主动点击,也可能是自动暂停、网络中断或播放结束导致的 pause,得加判断。
-
pause事件会在任何原因导致播放停止时触发,包括loadstart后还没开始播就暂停、ended后自动 pause 等 - 推荐加一个标志位(如
isUserPaused),配合play和pause事件一起记录用户操作意图 - 避免重复弹出:同一暂停周期内只触发一次广告,可用
adShown = true+setTimeout重置控制频率
广告弹窗要能覆盖 video 且不干扰播放控制
纯 alert() 或 confirm() 会阻塞页面、暂停 JS 执行,且无法自定义样式,完全不可用。必须用 DOM 元素模拟浮层:
- 广告容器需设置
position: absolute或fixed,z-index高于<video></video> - 视频区域建议加
pointer-events: none(在广告显示时),防止用户误点视频区域跳过广告 - 关闭按钮要绑定
click并恢复pointer-events: auto,同时调用video.play()(注意部分浏览器需用户手势触发)
移动端自动播放限制影响广告触发时机
iOS Safari 和 Android Chrome 对自动播放限制严格,play() 被拒后可能直接进入 paused 状态,此时 pause 事件会立即触发,但用户根本没点过播放——这就导致广告在“还没播就弹”。
稳妥做法是结合 readyState 和 paused 状态判断:
video.addEventListener('pause', () => {
if (video.readyState >= 2 && !video.ended && video.currentTime > 0) {
showAd();
}
});
其中 readyState >= 2 表示已有足够数据可播放,currentTime > 0 排除初始加载暂停,!ended 过滤播放完成场景。
真正难处理的是首次加载失败又暂停的情况——这时候连 canplay 都没触发,pause 就来了,广告逻辑得兜底识别这种异常状态,否则体验极差。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











