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
: 发生错误时触发。
容易混淆的事件:
play
vs.playing
:play
是调用play()
方法后立即触发,表示播放指令已发出;playing
是视频实际开始播放后触发。canplay
vs.canplaythrough
:canplay
表示可以播放,但可能需要缓冲;canplaythrough
表示可以流畅播放,无需缓冲。loadeddata
vs.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'));
实际的触发顺序可能会因为网络状况、视频格式、浏览器等因素而有所不同。 通过监听这些事件,可以更好地控制视频播放过程,并提供更友好的用户体验。 建议根据实际需求选择需要监听的事件。