商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 前端JavaScript监听浏览器中所有资源的加载进度的方法与实践

前端JavaScript监听浏览器中所有资源的加载进度的方法与实践

  发布于2026-07-23 阅读(0)

扫一扫,手机访问

在现代 Web 开发中,了解页面中所有资源(如图片、脚本、样式表等)的加载进度,对于优化用户体验和调试性能问题来说,是一项非常关键的能力。坦白说,浏览器默认并不提供直接监听所有资源加载进度的 API,这就造成了一个很现实的问题:我们到底该怎么去掌握这些资源的加载情况?本文将深入探讨如何通过现有的技术手段,实现对浏览器中所有资源加载进度的监听,并给出一些实用的实现思路和建议。

一、为什么需要监听资源加载进度?

对于开发者和网站管理员来说,这种能力直接关系到几件事:

  1. 优化用户体验:通过显示加载进度条或加载动画,让用户明确知道页面正在加载,而不是干等着,这对提升用户留存率至关重要。
  2. 性能分析:搞清楚哪些资源加载缓慢,才能针对性地优化资源加载策略,从而有效缩短页面加载时间。
  3. 动态加载控制:根据资源加载进度,动态调整页面内容的显示或隐藏,避免用户看到支离破碎的页面。
  4. 错误处理:捕获资源加载失败的情况,及时提供备用资源或显示友好的错误提示信息。

二、实现方法

(一)监听window的load和DOMContentLoaded事件

DOMContentLoaded 事件在 DOM 完全加载和解析完毕时触发,但此时样式表、图片和子框架可能还没完成加载。load 事件则是在页面的所有资源(包括图片、样式表等)全部加载完成后才触发。

示例代码

document.addEventListener('DOMContentLoaded', () => {
  console.log('DOM fully loaded and parsed');
});

window.addEventListener('load', () => {
  console.log('All resources fully loaded');
});

这种方式可以大致了解页面加载的两个关键阶段,但无法获取单个资源的实时加载进度。

(二)使用Performance API

Performance API 提供了非常详尽的性能数据,可以用来获取各资源的加载时间和其他性能指标。

示例代码

const performanceEntries = performance.getEntriesByType('resource');
performanceEntries.forEach((entry) => {
  console.log(`Resource: ${entry.name}`);
  console.log(`Start Time: ${entry.startTime}`);
  console.log(`Duration: ${entry.duration}`);
});

这种方法可以获取已经加载的资源的性能数据,但同样无法实时监听资源的加载进度。

(三)拦截资源请求

通过拦截资源请求,可以实现实时监听每个资源的加载进度。具体有几种方式:

1. 使用MutationObserver监听动态加载的资源

MutationObserver 可以监听 DOM 的变化,包括动态添加的资源请求。

const observer = new MutationObserver((mutations) => {
  mutations.forEach((mutation) => {
    mutation.addedNodes.forEach((node) => {
      if (node.tagName === 'SCRIPT' || node.tagName === 'IMG' || node.tagName === 'LINK') {
        console.log(`New resource added: ${node.src || node.href}`);
      }
    });
  });
});

observer.observe(document, { childList: true, subtree: true });

这种方法可以捕获动态添加的资源,但无法直接获取它们的加载进度。

2. 使用Service Worker

Service Worker 是一个运行在浏览器后台的脚本,可以拦截和处理网络请求。通过它,可以实时监听所有资源的加载请求。

// 在 service-worker.js 中
self.addEventListener('fetch', (event) => {
  event.respondWith(
    fetch(event.request).then((response) => {
      console.log(`Resource loaded: ${event.request.url}`);
      return response;
    })
  );
});

在主页面中注册 Service Worker

if ('serviceWorker' in na vigator) {
  na vigator.serviceWorker.register('/service-worker.js')
    .then((registration) => {
      console.log('Service Worker registered:', registration);
    })
    .catch((error) => {
      console.error('Service Worker registration failed:', error);
    });
}

这种方法可以实时监听所有资源的加载请求,但需要用户同意启用 Service Worker,而且对浏览器的兼容性有特定要求。

3. 使用XMLHttpRequest或Fetch API拦截资源请求

通过自定义资源加载逻辑,可以使用 XMLHttpRequestFetch API 拦截资源请求,并监听加载进度。

function loadResource(url) {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', url, true);
  xhr.onprogress = (event) => {
    console.log(`Loading progress: ${event.loaded} / ${event.total}`);
  };
  xhr.onload = () => {
    console.log(`Resource loaded: ${url}`);
  };
  xhr.send();
}

loadResource('https://example.com/image.jpg');

这种方法可以精细监听单个资源的加载进度,但需要手动管理所有资源的加载逻辑,工作量较大。

(四)使用第三方库

市面上也有一些成熟的第三方库,比如 pace.jsnprogress,可以帮助实现资源加载进度的监听。它们通过监听网络请求和 DOM 变化,提供一个简单的进度条来显示页面加载进度。

示例代码:使用pace.js

  1. 引入 pace.js
  1. 配置 pace.js
paceOptions = {
  elements: true, // 监听 DOM 元素的加载
  restartOnRequestAfter: 0, // 在每次请求后重新启动进度条
};
  1. 显示进度条:

这种方法可以快速实现页面加载进度的可视化,但功能上受限于第三方库的设计和配置。

三、总结

监听浏览器中所有资源的加载进度,确实是一个复杂但非常有价值的任务。通过结合 windowloadDOMContentLoaded 事件、Performance API、MutationObserverService WorkerXMLHttpRequestFetch API 以及第三方库,基本上可以实现对资源加载进度的全面监控。

在实际开发中,可以根据具体需求灵活选择合适的方法。例如,如果只需要了解页面加载的大致阶段,那么 windowloadDOMContentLoaded 事件就足够了;如果需要更详细的性能数据,Performance API 是更好的选择;如果需要实时监听资源加载进度,那么 Service WorkerFetch API 是不错的方案。

掌握这些方法,开发者就能更好地优化用户体验,提升页面性能,并有效处理资源加载中的各种问题。

本文转载于:https://www.jb51.net/javascript/355793g8k.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注