video 指向视频元素,state 指向显示状态的元素。下面按按钮功能阅读代码。
① 点击播放:等待结果,再显示提示
document.querySelector('#play').addEventListener('click', async () => {
try {
await video.play();
state.textContent = '播放已启动';
} catch (error) {
state.textContent = '播放未成功:' + error.name;
}
});
addEventListener('click', …) 指定按钮被点击时执行的函数。play() 请求播放,返回一个 Promise,表示这次请求将来可能成功,也可能失败。
async 允许函数中使用 await。这里等待的是播放成功启动,不是视频播放结束;等待期间网页仍能响应操作。
成功后执行下一行提示;失败则进入 catch,用 error.name 显示错误名称。
② 点击暂停:调用 pause()
document.querySelector('#pause').addEventListener('click', () => {
video.pause();
});
pause() 暂停播放,不会把播放位置重置到开头。它不返回表示播放结果的 Promise,这里不需要 await。
③ 点击跳转:设置 currentTime
const seekButton = document.querySelector('#seek');
seekButton.addEventListener('click', () => {
video.currentTime = Math.min(30, video.duration);
});
currentTime 是当前播放位置,duration 是总时长,单位都是秒。Math.min 取较小值:视频长 90 秒时跳到第 30 秒;长 20 秒时跳到结尾。
设置位置不等于开始播放。先暂停,再点击跳转按钮,观察时间和播放状态。
④ 何时允许跳转:先取得视频时长
<button id="seek" type="button" disabled>跳到第30秒</button>
function showMetadata() {
document.querySelector('#duration').textContent =
video.duration.toFixed(1);
seekButton.disabled = false;
}
video.addEventListener('loadedmetadata', showMetadata);
if (video.readyState >= 1) showMetadata();
disabled 使按钮初始不可点击。元数据包含视频时长等基本信息;收到 loadedmetadata 后显示时长,并用 disabled = false 启用按钮。
toFixed(1) 保留一位小数。readyState >= 1 检查元数据是否已经就绪,避免注册监听器时事件已经发生而未更新界面。