html5play函数播放结束回调怎写_html5play函数结束回调法【步骤】
技术百科
絕刀狂花
发布时间:2026-01-28
浏览: 次 play() 方法无结束回调,其 Promise 在播放开始时解决而非结束;监听 ended 事件才是标准做法,需在 loadedmetadata 或 canplay 后绑定,避免漏触发。
HTML5 play() 方法本身没有结束回调
别被函数名误导了——play() 只是启动播放,它返回一个 Promise,但这个 Promise 解决(resolve)的时机是「播放成功开始」,不是「播完了」。想监听播放结束,得靠 ended 事件。
监听 ended 事件才是标准做法
所有现代浏览器都支持对 或 元素绑定 ended 事件,它在媒体自然播放到末尾时触发。
实操建议:
- 确保元素已加载元数据(
loadedmetadata或至少canplay后再监听,避免漏触发) - 用
addEventListener('ended', handler),不要用onended,便于后续移除 - 如果元素可能被复用(比如循环播放、切换资源),记得在新
src设置前先removeEventListener
简单示例:
const video = document.querySelector('video');
video.addEventListener('ended', () => {
console.log('播放结束了');
// 这里写你的回调逻辑,比如跳转、提示、自动重播等
});
为什么不用 timeupdate + duration 判断?
有人试图轮询当前时间是否接近 duration,这既不精确也不必要:
-
video.duration在未加载完成时可能是NaN或Inf -
timeupdate触发频率不稳定,
容易错过临界点
- 快进、网络缓冲、音视频不同步等情况会让时间比对失效
-
ended是浏览器原生事件,准确、轻量、语义明确
注意自动播放策略对 ended 的影响
如果视频是静音且自动播放(muted autoplay),ended 仍会正常触发;但如果因策略被阻止(比如有声音且无用户交互),play() 会抛错,ended 自然也不会来——所以务必检查 play() 的 Promise 是否 reject,并处理失败路径。
容易被忽略的一点:某些安卓 WebView 或旧版 iOS 中,ended 在全屏退出后可能延迟触发,或在资源释放过程中丢失。如需强保障,可结合 pause + currentTime === duration 做兜底判断,但仅限特定场景。
# 才是
# 它在
# 也不
# 加载
# 会让
# 绑定
# 跳转
# 自动播放
# 而非
# 浏览器
# 循环
# html
# 为什么
# 事件
# 回调
# ios
# promise
# 安卓
# webview
# html5
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Windows10如何更改桌面图标间距_Win10
- Windows10电脑怎么设置虚拟内存_Win10
- PHP中require语句后直接调用返回对象方法的
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- Python对象生命周期管理_创建销毁说明【指导】
- Mac怎么查看活动监视器_理解Mac进程和资源占用
- Win11怎么设置组合键快捷方式_Windows1
- Win11怎么设置右键刷新选项_Windows11
- 如何在Golang中操作嵌套切片指针_Golang
- windows如何禁用驱动程序强制签名_windo
- 如何使用Golang处理网络超时错误_Golang
- 如何使用Golang包导出规则_控制函数和变量可见
- Win11开机Logo怎么换_Win11自定义启动
- PythonWeb前后端整合项目教程_FastAP
- Go 中 := 短变量声明的类型推导机制详解
- Win10怎么卸载爱奇艺_Win10彻底卸载爱奇艺
- 如何在 Go 中创建包含映射(map)的切片(sl
- 如何使用Golang table-driven基准
- PythonFastAPI项目实战教程_API接口
- Windows10系统怎么查看IP地址_Win10
- Python高性能计算项目教程_NumPyCyth
- Win11怎么查看显卡显存_查询Win11显卡详细
- php条件判断怎么写_ifelse和switchc
- 如何在 Pandas 中按元素交集合并两列字符串
- 如何在 Python 测试中动态配置 @backo
- Windows11怎样开启游戏模式_Windows
- Win11怎么关闭定位服务_保护Win11位置隐私
- Win11怎么更改输入法顺序_Win11调整语言首
- Win11怎么用设置清理回收站_Win11设置清理
- C++如何编写函数模板?(泛型编程入门)
- Win11怎么设置默认图片查看器_Windows1
- php与c语言在嵌入式中有何区别_对比两者在硬件控
- Python对象生命周期管理_创建销毁解析【教程】
- LINUX下如何配置VLAN虚拟局域网_在LINU
- Go 语言标准库为何不提供泛型 Contains
- Windows10怎么用“讲述人”读屏辅助 Win
- LINUX怎么设置系统语言_LINUX修改中文环境
- Ajax提交表单PHP怎么接收_处理Ajax发送的
- 如何使用Golang反射创建map对象_动态生成键
- Win11怎么开启游戏模式_Win11优化游戏帧数
- c++怎么实现大文件的分块读写_c++ 文件指针s
- Win11怎么检查TPM2.0模块_Windows
- Win11如何设置环境变量 Win11添加和修改系
- 如何在JavaScript中动态拼接PHP的bas
- Windows10怎么备份注册表_Windows1
- Mac怎么给文件夹加密_Mac创建加密磁盘映像教程
- Win11怎么关闭自动调节屏幕亮度_Windows
- Windows10如何更改系统字体大小_Win10
- Python随机数生成_random模块说明【指导
- c++中如何求一个数的平方根_c++ sqrt函数


QQ客服