如何通过html5中video标签的networkstate判断当前多媒体是否处于加载中

Video 标签本身没有直接的 networkState 属性可“判断是否处于加载中”,但可以通过监听 networkState 值的变化,并结合其含义来间接推断加载状态。

networkState 的取值及含义

video.networkState 是只读属性,返回一个数字,对应以下常量(定义在 HTMLMediaElement 接口上):

0(NETWORK_EMPTY):媒体元素刚创建,尚未初始化,src 未设置或为空 1(NETWORK_IDLE):已选择资源,但尚未开始下载(例如设置了 src 但未调用 load() 或未自动触发加载) 2(NETWORK_LOADING):正在下载媒体数据 —— 这就是你关心的“加载中”状态 3(NETWORK_NO_SOURCE):找不到可用的媒体源(所有 source 都失败)

如何可靠检测“正在加载中”

仅靠单次读取 networkState === 2 不够可靠,因为该状态可能转瞬即逝。推荐方式是:

监听 loadstart 事件 —— 它在浏览器开始加载媒体资源时触发,此时 networkState 通常已为 2 监听 progress 事件 —— 在加载过程中持续触发,说明仍在下载中 配合检查 networkState === 2,可排除已暂停、出错或完成的情况 注意:canplay 或 canplaythrough 触发后,networkState 仍可能是 2(边播边下),所以不能仅靠播放事件退出“加载中”逻辑

实用示例代码

以下代码展示如何响应“加载中”状态并更新 UI:

立即学习“前端免费学习笔记(深入)”;

<video id="myVideo" controls> <source src="video.mp4" type="video/mp4"></video><div id="status">等待加载…</div>

<script>const video = document.getElementById(‘myVideo’);const statusEl = document.getElementById(‘status’);const updateLoadingStatus = () => { if (video.networkState === 2) { statusEl.textContent = ‘正在加载中…’; } else if (video.readyState > 0) { statusEl.textContent = ‘已加载部分/可播放’; } else if (video.networkState === 3) { statusEl.textContent = ‘加载失败:无可用资源’; }};// 初始检查updateLoadingStatus();// 关键事件监听video.addEventListener(‘loadstart’, () => { statusEl.textContent = ‘开始加载…’;});video.addEventListener(‘progress’, updateLoadingStatus);video.addEventListener(‘suspend’, updateLoadingStatus); // 如用户暂停、网络中断等video.addEventListener(‘error’, () => { statusEl.textContent = ‘加载出错’;});</script>

注意事项

networkState 不会实时反映缓冲进度,它只表示网络连接层面的状态(空闲、加载、失败等) 移动端或节电模式下,progress 可能不频繁触发,建议搭配 timeupdate 或定时轮询 buffered 范围做补充判断 使用 preload="none" 时,networkState 默认为 1,需手动调用 load() 才会进入 2 不要依赖 networkState 判断“是否加载完成”,应使用 loadeddata、canplay 或 readyState === 4

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。