video.onloadeddata
()
video.onloadeddata
是 JavaScript 中用于监听 HTML <video>
元素 「当前帧数据已加载」 的事件处理器。当视频的第一帧画面数据加载完成(足以开始播放)时,会触发此事件。
1. 基本用法
const video = document.querySelector('video');video.onloadeddata = function() {console.log('视频第一帧已加载,可以播放了!'); };
-
触发时机:
-
视频元数据(如分辨率、时长)和第一帧画面加载完成。
-
早于
oncanplay
(可流畅播放的事件)。
-
-
用途:在视频初始渲染时执行操作(如显示封面、初始化播放器)。
2. 替代方案:addEventListener
推荐使用 addEventListener
,避免覆盖已有事件:
video.addEventListener('loadeddata', function() {console.log('视频数据已加载'); });
3. 常见应用场景
① 显示视频封面(第一帧)
video.addEventListener('loadeddata', function() {const canvas = document.createElement('canvas');canvas.width = video.videoWidth;canvas.height = video.videoHeight;canvas.getContext('2d').drawImage(video, 0, 0);document.querySelector('.video-cover').appendChild(canvas); });
② 初始化播放器状态
video.addEventListener('loadeddata', function() {// 显示自定义播放按钮document.querySelector('.play-button').style.display = 'block'; });
③ 检测视频基础信息
video.addEventListener('loadeddata', function() {console.log('视频分辨率:', video.videoWidth, 'x', video.videoHeight);console.log('视频时长:', video.duration); });
4. 与其他视频事件的区别
事件 | 触发条件 |
---|---|
onloadedmetadata | 仅元数据(如时长、分辨率)加载完成,但画面未加载。 |
onloadeddata | 第一帧画面加载完成,可显示画面但可能无法流畅播放。 |
oncanplay | 已加载足够数据可开始播放(但不保证不卡顿)。 |
oncanplaythrough | 已加载足够数据可流畅播放至结束(理想状态)。 |
5. 注意事项
-
网络环境影响:如果视频文件较大或网络慢,
loadeddata
可能延迟触发。 -
与
preload
属性相关:若<video preload="none">
,需用户交互后才会加载数据。 -
移动端兼容性:部分移动浏览器可能延迟加载数据以节省流量。
总结
video.onloadeddata
是视频处理的基础事件之一,适合在视频画面首次可用时执行初始化操作。若需更高兼容性,建议结合 loadedmetadata
和 canplay
事件使用。
video.ontimeupdate()
video.ontimeupdate()
是 JavaScript 中用于监听 HTML <video>
元素播放时间更新的事件处理器。当视频播放时,只要当前播放位置(currentTime
)发生变化,就会触发该事件。
1. 基本用法
const video = document.querySelector('video');video.ontimeupdate = function() {console.log('当前播放时间:', video.currentTime); };
-
触发时机:视频播放、用户拖动进度条、跳转时间点等。
-
用途:实时监测播放进度,用于更新进度条、显示字幕、记录观看行为等。
2. 替代方案:addEventListener
更推荐使用 addEventListener
,避免覆盖已有事件:
video.addEventListener('timeupdate', function() {console.log('时间更新:', video.currentTime); });
3. 常见应用场景
① 自定义进度条同步
video.addEventListener('timeupdate', function() {const progress = (video.currentTime / video.duration) * 100;document.querySelector('.progress-bar').style.width = `${progress}%`; });
② 字幕/弹幕显示
const subtitles = [{ time: 5, text: "第一句字幕" },{ time: 10, text: "第二句字幕" } ];video.addEventListener('timeupdate', function() {subtitles.forEach(item => {if (video.currentTime >= item.time && video.currentTime < item.time + 2) {document.querySelector('.subtitle').textContent = item.text;}}); });
③ 记录观看进度
video.addEventListener('timeupdate', function() {localStorage.setItem('videoProgress', video.currentTime); });// 下次打开页面时恢复进度 video.currentTime = parseFloat(localStorage.getItem('videoProgress')) || 0;
4. 注意事项
-
性能优化:
timeupdate
触发频率较高(约每秒4-60次),避免在回调中执行复杂计算。 -
与
seeked
事件区别:seeked
仅在用户手动跳转后触发,而timeupdate
在播放过程中持续触发。
总结
video.ontimeupdate
是控制视频交互的核心事件之一,适用于进度跟踪、动态内容加载等场景。推荐使用 addEventListener('timeupdate')
以保持代码灵活性。