H5中video的事件的触发顺序是怎样的?
H5 video 元素的事件触发顺序比较复杂,会根据网络状况、用户交互等因素而变化。以下列出一些关键事件及其大致的触发顺序,并解释一些容易混淆的情况:
1. 加载阶段:
loadstart: 视频开始加载时触发。这是第一个触发的事件。durationchange: 视频时长信息获取到后触发。可能在loadedmetadata之前或之后触发,取决于浏览器和视频格式。loadedmetadata: 获取到视频元数据(例如时长、尺寸、轨道信息)后触发。loadeddata: 第一帧数据加载完成,可以开始播放,但未必能流畅播放。progress: 正在加载数据时周期性地触发。可以通过该事件跟踪加载进度。canplay: 可以播放视频,但可能需要缓冲才能流畅播放。canplaythrough: 可以流畅播放视频,无需缓冲。loadeddata: 视频数据已加载。
2. 播放阶段:
playing: 视频开始播放或从暂停状态恢复播放时触发。 注意,play事件先于playing触发。play: 调用play()方法后触发,表示开始播放视频的指令已发出,但此时视频可能还未真正开始播放。waiting: 视频由于需要缓冲下一帧而暂停播放时触发。timeupdate: 当前播放时间改变时周期性地触发。pause: 视频暂停时触发。ended: 视频播放结束时触发。
3. 其他事件:
seeking: 开始跳转到新的播放位置时触发。seeked: 跳转到新的播放位置完成时触发。ratechange: 播放速率改变时触发。volumechange: 音量改变时触发。error: 发生错误时触发。
容易混淆的事件:
playvs.playing:play是调用play()方法后立即触发,表示播放指令已发出;playing是视频实际开始播放后触发。canplayvs.canplaythrough:canplay表示可以播放,但可能需要缓冲;canplaythrough表示可以流畅播放,无需缓冲。loadeddatavs.canplay:loadeddata表示已加载足够的数据可以开始播放,canplay表示可以播放,但未必流畅。canplay通常在loadeddata之后触发。
示例代码 (监听关键事件):
const video = document.getElementById('myVideo');
video.addEventListener('loadstart', () => console.log('loadstart'));
video.addEventListener('loadedmetadata', () => console.log('loadedmetadata'));
video.addEventListener('loadeddata', () => console.log('loadeddata'));
video.addEventListener('canplay', () => console.log('canplay'));
video.addEventListener('canplaythrough', () => console.log('canplaythrough'));
video.addEventListener('play', () => console.log('play'));
video.addEventListener('playing', () => console.log('playing'));
video.addEventListener('pause', () => console.log('pause'));
video.addEventListener('ended', () => console.log('ended'));
video.addEventListener('waiting', () => console.log('waiting'));
video.addEventListener('timeupdate', () => console.log('timeupdate'));
video.addEventListener('seeking', () => console.log('seeking'));
video.addEventListener('seeked', () => console.log('seeked'));
实际的触发顺序可能会因为网络状况、视频格式、浏览器等因素而有所不同。 通过监听这些事件,可以更好地控制视频播放过程,并提供更友好的用户体验。 建议根据实际需求选择需要监听的事件。
浙公网安备 33010602011771号