【前端基础】script引入资源脚本加载失败解决方案(重新加载获取备用资源)

问题描述

现在假设有一个script资源加载失败,代码如下

<!DOCTYPE html>
<html>
<head><title>script 资源加载失败</title>
</head>
<body><script src="http:hdh.sdas.asdas/1.js"></script>
</body>
</html>

我们希望在加载失败的时候进行一系列的解决操作,那么就需要有两步操作:

  1. 捕获加载失败事件
  2. 对加载失败操作进行处理(重新获取重试)

捕获加载失败事件

注意:
这里既然是捕获 script 资源加载错误,就要在 script 资源加载之前注册监听事件。因此把这段代码放在所有 script 标签之前

全局监听错误事件

在这里插入图片描述

true: 是一个可选的参数,表示在捕获阶段触发事件处理程序。在事件传播过程中,捕获阶段是指从最外层的元素向目标元素的阶段。这里设置为true表示在捕获阶段触发处理程序,如果设置为false或省略,则在冒泡阶段触发处理程序(从目标元素向最外层的元素)。

<!DOCTYPE html>
<!DOCTYPE html>
<html>
<head><title>script 资源加载失败</title><script type="text/javascript"><!-- 这里需要添加 true 属性 -->window.addEventListener('error',(e)=>{console.log('有错误')},true)</script>
</head>
<body><script src="http:hdh.sdas.asdas/1.js"></script>
</body>
</html>

捕获资源加载失败类型错误

首先我们打印一下监听事件的 e 元素,会发现 script 加载失败事件的属性和别的错误属性有两个特征,只要把握住这两个特征就可以进行判断处理:

  1. 特点1:是个 Event 对象
  2. 特点2:target 属性为 script

在这里插入图片描述

<!DOCTYPE html>
<html>
<head><title>script 资源加载失败</title><script type="text/javascript"><!-- 这里需要添加 true 属性 -->window.addEventListener('error',(e)=>{const tag = e.target// 添加判断事件类型if(tag.tagName === 'SCRIPT' && !(e instanceof ErrorEvent)){console.log('有错误')}},true)</script>
</head>
<body><script src="http:hdh.sdas.asdas/1.js"></script>
</body>
</html>

完整案例代码

在这里插入图片描述

<!DOCTYPE html>
<html>
<head><title>script 资源加载失败</title><script type="text/javascript">// 这里是模拟的一些备用域名const domains = ['test.1.com','test.2.com','test.3.com']// 最大的重试次数const maxRetry = 5// 资源加载信息const retryInfo = {}window.addEventListener('error',(e)=>{console.log('e',e)const tag = e.target// 只对 script 加载失败错误进行处理if(tag.tagName === 'SCRIPT' && !(e instanceof ErrorEvent)){const url = new URL(tag.src)console.log('url',url)// 如果该文件没有加载失败信息,则初始化if(!retryInfo[url.pathname]){retryInfo[url.pathname] = {times:0,nextIndex:0}}const info = retryInfo[url.pathname]console.log('info',retryInfo)// 加载失败次数小于最大重试次数if(info.times < maxRetry){url.host = domains[info.nextIndex]// 阻塞页面后续的加载document.write(`<script src="${url.toString()}">\<\/script>`)// 以下这种方式就不会按顺序加载 script 内容// const script = document.createElement('script')// script.src = url.toString()// document.body.insertBefore(script,tag)// 下标循环info.nextIndex = (info.nextIndex + 1) % domains.lengthinfo.times++}}},true)</script>
</head>
<body><!-- 模拟一个加载失败的资源 --><script src="http:hdh.sdas.asdas/1.js"></script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/237654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openGuass:极简版安装

目录 一、openGauss简介 二、初始化安装环境 1.创建安装用户 2.修改文件句柄设置 ​3.修改SEM内核参数 4.关闭防火墙 6.禁用SELINUX 7.安装依赖软件 8.重启服务器 三、安装数据库 1.下载安装包 2.创建安装目录 3.解压安装包 4.执行安装 5.验证安装 四、gsql工具…

【大数据存储与处理】第一次作业

hbase 启动步骤 1、启动 hadoop&#xff0c;master 虚拟机&#xff0c;切换 root 用户&#xff0c;输入终端命令&#xff1a;start-all.sh 2、启动 zookeeper&#xff0c;分别在 master、slave1、slave2 虚拟机终端命令执行&#xff1a;zkServer.sh start 3、启动 hbase&#x…

Tomcat报404问题解决方案大全(包括tomcat可以正常运行但是报404)

文章目录 Tomcat报404问题解决方案大全(包括tomcat可以正常运行但是报404)1、正确的运行页面2、报错404问题分类解决2.1、Tomcat未配置环境变量2.2、IIs访问权限问题2.3、端口占用问题2.4、文件缺少问题解决办法&#xff1a; Tomcat报404问题解决方案大全(包括tomcat可以正常运…

04-JVM字节码文件结构深度剖析

一、源代码 package com.tuling.jvm;public class TulingByteCode {private String userName;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName userName;} }二、通过javap -verbose TulingByteCode .class反编译 //…

【Spring Security】打造安全无忧的Web应用--进阶篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Spring Security的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.导入相关配置 1.pom 2.ym…

【sgDragUploadFolder】自定义组件:自定义拖拽文件夹上传组件,支持上传单个或多个文件/文件夹,右下角上传托盘出现(后续更新...)

特性&#xff1a; 支持在拖拽上传单个文件、多个文件、单个文件夹、多个文件夹可自定义headers可自定义过滤上传格式可自定义上传API接口支持显示/隐藏右下角上传队列托盘 sgDragUploadFolder源码 <template><div :class"$options.name" :dragenter"i…

.Net Core webapi RestFul 统一接口数据返回格式

在RestFul风格盛行的年代&#xff0c;大部分接口都需要一套统一的数据返回格式&#xff0c;那么我们怎么才能保证使用统一的json数据格式返回呢&#xff0c;下面给大家简单介绍一下&#xff1a; 假如我们需要接口统一返回一下数据格式&#xff1a; {"statusCode": …

智能图像编辑软件Luminar Neo mac提供多种调整和滤镜选项

Luminar Neo mac是一款由Skylum公司开发的AI技术图像编辑软件&#xff0c;旨在为摄影师和视觉艺术家提供创意图像编辑解决方案。Luminar Neo拥有强大的AI技术和丰富的后期处理工具&#xff0c;可帮助用户快速轻松地实现从基本到高级的图像编辑需求。 Luminar Neo提供了多种调整…

同步与互斥(二)

一、谁上锁就由谁解锁&#xff1f; 互斥量、互斥锁&#xff0c;本来的概念确实是&#xff1a;谁上锁就得由谁解锁。 但是FreeRTOS并没有实现这点&#xff0c;只是要求程序员按照这样的惯例写代码。 main函数创建了2个任务&#xff1a; 任务1&#xff1…

先进制造身份治理现状洞察:从手动运维迈向自动化身份治理时代

在新一轮科技革命和产业变革的推动下&#xff0c;制造业正面临绿色化、智能化、服务化和定制化发展趋势。为顺应新技术革命及工业发展模式变化趋势&#xff0c;传统工业化理论需要进行修正和创新。其中&#xff0c;对工业化水平的判断标准从以三次产业比重标准为主回归到工业技…

Kubernetes 容器编排(7)

离线业务编排详解 在线业务和离线业务 在线业务 Deployment、StatefulSet以及 DaemonSet 这三个编排概念的共同之处是&#xff1a;它们主要编排的对象&#xff0c;都是"在线业务"&#xff0c;即&#xff1a;Long Running Task&#xff08;长作业&#xff09;。比如…

尚硅谷 java 2023(基础语法)笔记

一、变量与运算符 1、HelloWorld的编写和执行 class HelloChina{public static void main(String[] args){System.out.println("hello,world!!你好&#xff0c;中国&#xff01;");} } 总结&#xff1a; 1. Java程序编写和执行的过程&#xff1a; 步骤1&#xff1…

HackTheBox - Medium - Linux - Sandworm (我的创作纪念日

Sandworm Sandworm 是一台中等难度的 Linux 机器&#xff0c;它托管了一个具有“PGP”验证服务的 Web 应用程序&#xff0c;该服务容易受到服务器端模板注入 &#xff08;SSTI&#xff09; 的攻击&#xff0c;导致“Firejail”监狱内的远程代码执行 &#xff08;RCE&#xff0…

12、Qt:用QProcess类启动外部程序:简单使用

一、说明 简单使用&#xff1a;在一个函数中&#xff0c;使用QProcess类的临时对象调用可执行文件exe&#xff0c;只有这个exe执行完了&#xff0c;这个函数才往下执行&#xff0c;一次性打印出exe所有输出信息&#xff1b;复杂使用&#xff1a;创建QProcess类的全局对象&…

STM32F4的DHT11初始化与实例分析

STM32—— DHT11 本文主要涉及STM32F4 的DHT11的使用以及相关时序的介绍&#xff0c;最后有工程下载地址。 文章目录 STM32—— DHT11一、 DHT11的介绍1.1 DHT11的经典电路 二、DHT11的通信2.1 DHT11的传输数据格式2.2 DHT11 通信分步解析 三、 DHT11 代码3.1 引脚图3.2 电路图…

阿里云林立翔:基于阿里云 GPU 的 AIGC 小规模训练优化方案

云布道师 本篇文章围绕生成式 AI 技术栈、生成式 AI 微调训练和性能分析、ECS GPU 实例为生成式 AI 提供算力保障、应用场景案例等相关话题展开。 生成式 AI 技术栈介绍 1、生成式 AI 爆发的历程 在 2022 年的下半年&#xff0c;业界迎来了生成式 AI 的全面爆发&#xff0c…

【接口测试】HTTP接口详细验证清单

概述 当我们在构建、测试、发布一套新的HTTP API时&#xff0c;包括我在内的大多数人都不知道他们所构建的每一个组件的复杂性和细微差别。 即使你对每一个组件都有深刻的理解&#xff0c;也可能会有太多的信息在你的脑海中出现。 以至于我们不可能一下把所有的信息进行梳理…

pycharm下执行conda命令提示无法识别解决方案

1 问题描述 win10环境命令行执行conda命令&#xff0c;报命令无法识别&#xff0c;错误信息如下&#xff1a; PS D:\code\cv> conda activate pt conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&a…

python基础语法总结

基础是深入必不可少的&#xff0c;如果没有基础的支持&#xff0c;后面都是浮云&#xff0c;就像情侣之间&#xff0c;没有感情基础是不会有好结果的&#xff0c;物资基础是靠两个人打拼的&#xff0c;所以学习就像谈恋爱&#xff0c;两个人要学会沟通&#xff0c;才能修成正果…

循环神经网络中的梯度消失或梯度爆炸问题产生原因分析(二)

上一篇中讨论了一般性的原则&#xff0c;这里我们具体讨论通过时间反向传播&#xff08;backpropagation through time&#xff0c;BPTT&#xff09;的细节。我们将展示目标函数对于所有模型参数的梯度计算方法。 出于简单的目的&#xff0c;我们以一个没有偏置参数的循环神经…