首页 > 其他分享 >网页文件加载失败如何重试

网页文件加载失败如何重试

时间:2024-07-16 11:29:38浏览次数:10  
标签:retry const script 网页文件 js 重试 key 加载

本文由 ChatMoney团队出品
在我们开发网站应用时,我们可能会遇到脚本加载失败的情况,导致脚本加载失败的原因有很多,比如用户的网络问题、终端设备问题、用户浏览器版本等诸多因素。
解决方案
在 JavaScript 中,我们可以创建一个监听来监听脚本加载失败的情况,然后针对加载失败的脚本进行重新加载。
重新加载的方案,一般是通过更换域名来解决。我们给每个脚本添加一个映射关系表,用来在加载失败时匹配新的域名进行重试。
具体的解决方案,下面我一步一步讲解,另外希望大家可以仔细阅读注释中的内容

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>脚本加载失败如何重试</title>
    <script>
      window.addEventListener(
        "error", // 监听全局错误
        function (e) {
          console.log(e);
        },
        true // 由于脚本加载失败不会冒泡,所以我们要在捕获阶段进行监听
      );
    </script>
  </head>
  <body>
    <script src="https://www.zowlsat.com/api/1.js"></script>
    <script src="https://www.qqqqqqq.com/api/2.js"></script>
    <script src="https://www.zowlsat.com/api/3.js"></script>
  </body>
</html>

此时我们可以在浏览器控制台看到以下效果

但是这个监听方法会监听到很多其他的错误,我们只需要监听脚本加载失败的错误,所以我们要通过这个监听事件的参数 e 来判断了

根据上图我们可以发现,普通错误的类型是 ErrorEvent,而脚本加载失败的类型是 Event,并且他的 target 会指向 script 标签,所以我们根据这个区别过滤掉其他的错误,这样剩下的情况才是我们需要处理的。

window.addEventListener(
  "error",
  function (e) {
    if (e.target.tagName !== "SCRIPT" || e instanceof ErrorEvent) return;
    console.log(e);
  },
  true
);

接下来就是如何来实现重新加载,我们先给需要重新加载的域名建立一个映射关系,用于替换映射关系表中的域名。然后就是挨个匹配,当还是加载失败时继续匹配下一个,直到成功为止。

const domainList = ["www.aaaaa.com", "www.bbbbb.com", "www.zowlsat.com"];
const retry = {};
window.addEventListener(
  "error",
  function (e) {
    if (e.target.tagName !== "SCRIPT" || e instanceof ErrorEvent) return;
    // 创建一个URL对象
    const url = new URL(e.target.src);
    // 获取文件路径
    const key = url.pathname;
    // 假如映射表中没有这个文件路径,那么就初始化一个映射键
    if (!(key in retry)) {
      retry[key] = 0;
    }
    // 假如匹配完整个映射表都没重新加载成功,则放弃
    const index = retry[key];
    if (index >= domainList.length) {
      return;
    }
    // 获取新的完整路径
    const domain = domainList[index];
    // 替换域名
    url.host = domain;
    // 创建新的script标签
    const script = document.createElement("script");
    script.src = url.toString();
    // 将新的script标签追加到加载失败的script标签之前
    document.body.insertBefore(script, e.target);
    retry[key]++;
  },
  true // 由于脚本加载失败不会冒泡,所以我们要在捕获阶段进行监听
);

到此为止,我们功能已经基本实现,效果如下图

但是有一个很关键的问题,就是假如我 2.js 这个文件中的内容,在 3.js 中要使用,那这样的话,2.js 就必须加载到 3.js 之前,否则就会报错。此时,我们就需要在 2.js 加载失败时,阻塞浏览器的解析,知道重新加载完成或者放弃重新加载时,再继续渲染之后的内容。
那这样的话我们该怎么做呢?

标签:retry,const,script,网页文件,js,重试,key,加载
From: https://www.cnblogs.com/chatrun/p/18304802

相关文章

  • 无畏契约加载xapofx15.dll失败该如何应对,《无畏契约》加载xapofx15.dll失败解决方法
    在体验由拳头公司开发且运营的第一人称战术射击游戏《无畏契约》的过程里,有部分玩家或许会碰到“加载xapofx15.dll失败”这样的错误提示,从而致使游戏没办法正常地启动或者运行。本篇将为大家带来的内容,感兴趣的小伙伴们一起来看看吧,希望能够帮助到大家。xapofx15.dll属于......
  • 三个点加载效果
    <!DOCTYPEhtml><htmllang="en"><head>  <metacharset="UTF-8">  <metaname="divport"content="width=device-width,initial-scale=1.0">  <title>Document</title>  ......
  • 设计模式:使用闭包实现数据集加载过程的依赖倒转
    重点数据集和数据集使用到的参数可以保持不同,将这些不同放到配置文件中进行处理而不是修改获取数据集的加载代码,优点是:减少修改代码的出错统一数据加载的接口格式设计模式:使用闭包实现数据集加载过程的依赖倒转重点前言一、什么是装饰器1、装饰器的定义2、装饰器的使......
  • Ajax代码运行前应该先加载jQuery
    <scriptsrc="{%static'js/jquery-3.6.0.min.js'%}"></script><script>//使用jQuery获取分类列表并绑定点击事件,用于自动更新【博客分类】阅读$(document).ready(function(){$('#category-list').on('click','li',fun......
  • 动态库链接和加载时的路径搜索优先级
    目录前言动态库的链接动态库的加载前言在开发一个新项目时遇到了动态库加载异常的问题,因此在这里记录一下动态库的链接和加载过程中库路径的搜索优先级的相关知识。动态库的链接现在有一个main.o可重定位目标文件,其中需要用到开源库log4cpp。在链接的时候,我们可以这样链接:g++......
  • Webpack 代码分割和懒加载技术
    在现代前端开发中,优化应用性能是一个至关重要的任务。Webpack作为一个强大的打包工具,为我们提供了代码分割和懒加载的功能,可以显著提升应用的加载速度和用户体验。本文将深入解析Webpack的代码分割和懒加载技术,帮助开发者更好地理解和应用这些技术。什么是代码分割?代码分割(Co......
  • 免费五大图床高速CDN、稳定、体验、加载速度、值得长期使用
    首要,让咱们深化了解一下那些由热心人士建立并同享出来的免费图床。这类图床通常是依据Chevereto或imgurl等渠道构建而成。Chevereto类型的图床,其显著特点之一就是大部分都需求用户进行注册。注册完成后,您会惊喜地发现,它能够为您回来丰厚多样的图片链接格式。不仅如此,此......
  • 如何理解electron 的预加载脚本
    在Electron应用中,预加载脚本(PreloadScript)是一个非常重要的概念,它允许你在渲染进程(web页面)和主进程之间创建一个安全的桥梁。预加载脚本运行在Node.js环境中,但位于渲染进程的一个单独的上下文中,这意味着它可以访问Node.js的API,但无法直接访问DOM。这种设计使得预......
  • Linux驱动加载源码分析(安全加载 、签名、校验)
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。环境说明  无前言  很久很久以前,在android上面移植linux驱动的时候,由于一些条件限制,导致我们测试驱动非常的麻烦。其中有一个麻烦就是驱动校验失败,然后内核拒......
  • CloudMounter for mac(云盘本地加载工具)v4.7版
    CloudMountermac版是Macos上一款云盘本地加载工具,CloudMountermac下载用于将云存储和Web服务器作为本地磁盘安装到Mac。CloudMounterformac通过让您在舒适的Finder中与云和远程服务器进行通信,使得与远程主机一起工作就像数据存储在您的计算机上一样简单。CloudMounterfor......