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

 更新时间:2025年12月29日 09:24:05   作者:阿珊和她的猫  
在现代 Web 开发中,了解页面中所有资源(如图片、脚本、样式表等)的加载进度对于优化用户体验和调试性能问题至关重要,然而,浏览器默认并不提供直接监听所有资源加载进度的 API,本文将探讨如何通过现有的技术手段,实现对浏览器中所有资源加载进度的监听

在现代 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');
});

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

(二)使用PerformanceAPI

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,可以实时监听所有资源的加载请求。

// 在 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 navigator) {
  navigator.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
<script src="https://cdnjs.cloudflare.com/ajax/libs/pace/1.0.2/pace.min.js"></script>
  1. 配置 pace.js
paceOptions = {
  elements: true, // 监听 DOM 元素的加载
  restartOnRequestAfter: 0, // 在每次请求后重新启动进度条
};
  1. 显示进度条:
<div id="pace"></div>

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

三、总结

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

在实际开发中,可以根据具体需求选择合适的方法。例如,如果只需要大致了解页面加载进度,可以使用 windowloadDOMContentLoaded 事件;如果需要更详细的性能数据,可以使用 Performance API;如果需要实时监听资源加载进度,可以使用 Service WorkerFetch API

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

以上就是前端JavaScript监听浏览器中所有资源的加载进度的方法与实践的详细内容,更多关于JavaScriptt监听浏览器资源加载进度的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript中判断字符串是否为空的几种常用方法

    JavaScript中判断字符串是否为空的几种常用方法

    JavaScript字符串的判空方法有很多种,下面这篇文章主要给大家介绍了关于JavaScript中判断字符串是否为空的几种常用方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • JS获取表格内指定单元格html内容的方法

    JS获取表格内指定单元格html内容的方法

    这篇文章主要介绍了JS获取表格内指定单元格html内容的方法,涉及javascript中innerHTML属性的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • 验证用户是否修改过页面的数据的实现方法

    验证用户是否修改过页面的数据的实现方法

    在实现程序的修改模块时,要在页面端检查用户是否修改过数据,以便提醒用户及时保存修改后的数据。
    2008-09-09
  • js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前

    js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前

    本篇文章主要介绍了js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前的实例。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • javascript实现评分功能

    javascript实现评分功能

    这篇文章主要为大家详细介绍了javascript实现评分功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • 微信小程序用swiper实现滑动刻度尺

    微信小程序用swiper实现滑动刻度尺

    这篇文章主要为大家详细介绍了微信小程序用swiper实现滑动刻度尺,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • JavaScript实现带音效的烟花特效

    JavaScript实现带音效的烟花特效

    这篇文章主要为大家介绍了通过JavaScript实现的带音效的烟花特效,文中的示例代码简洁易懂,对我们学习JavaScript有一定的帮助,感兴趣的可以了解一下
    2021-12-12
  • Javascript获取background属性中url的值

    Javascript获取background属性中url的值

    Javascript获取CSS中属性值方法有很多,今天工作的时候遇到了一个问题是需要利用Javascript获取css中background-img属性url的值,通过查阅网站的资料找到了解决方法,现在将方法分享给大家,有需要的朋友们们可以参考借鉴,下面来一起看看吧。
    2016-10-10
  • for of 和 for in 的区别介绍

    for of 和 for in 的区别介绍

    这篇文章主要介绍了for of 和 for in 的区别,for of 和 for in都是用来遍历的属性,本文重点介绍下for of 和 for in 的区别,需要的朋友可以参考下
    2022-12-12
  • JavaScript面向对象编程小游戏---贪吃蛇代码实例

    JavaScript面向对象编程小游戏---贪吃蛇代码实例

    这篇文章主要介绍了JavaScript贪吃蛇的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05

最新评论