【前端基础】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.hqwc.cn/news/293181.html

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

相关文章

用水用电用燃气PSD大屏文件,电力行业可视化大数据(供水供电可视化管理后台资料)

通过对水、电、燃气等能源的使用情况进行统计和分析&#xff0c;可以有效地预测能源需求&#xff0c;为企业的能源管理提供决策依据。现分享大屏燃气大数据可视化平台、电力行业可视化大数据展示平台、大工商业用气快速报告、供水供电可视化管理后台等大屏模版的Photoshop源文件…

2. 创建型模式 - 抽象工厂模式

亦称&#xff1a; Abstract Factory 意图 抽象工厂模式是一种创建型设计模式&#xff0c; 它能创建一系列相关的对象&#xff0c; 而无需指定其具体类。 问题 假设你正在开发一款家具商店模拟器。 你的代码中包括一些类&#xff0c; 用于表示&#xff1a; 一系列相关产品&…

DSC2803X,DSP Pin2Pin with Ti Parts

一&#xff0c;产品特性 高能效 32 位处理器(H28x 内核)  主频 120MHz&#xff08;周期 8.33ns&#xff09;  哈佛(Harvard) 总线架构  硬件乘法/除法单元  4/6 通道高速 DMA  快速中断响应和处理  统一存储器编程模型  高效代码&#xff08;使用 C/C和汇编语言&…

测试框架|Burp Suite几个基本工具的使用

前阵子项目上想通过测试工具在网页上模拟返回错误代码 500 来查看页面的错误处理&#xff0c;然后去调查了下 burp suite&#xff0c;看了些基本工具的使用文档。虽然最后证实 burp suite 只能用来处理页面测试应用程序的实际行为和响应&#xff0c;而不是尝试模拟不存在的问题…

TCP/IP:从数据包到网络的演变

引言 TCP/IP协议的起源可以追溯到20世纪60年代末和70年代初&#xff0c;美国国防部高级研究计划局&#xff08;ARPA&#xff09;研究开发一种可靠的通信协议&#xff0c;用于连接分散在不同地点的计算机和资源。 在当时&#xff0c;计算机之间的连接并不像现在这样普遍和便捷…

【vtkWidgetRepresentation】第十六期 vtkContourRepresentation(三)

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkContourLineInterpolator接口的源码剖析和实例应用,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 前言 …

「Verilog学习笔记」自动售卖机

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule sale(input clk ,input rst_n ,input sel ,//sel0,5$dranks,sel1,10&$drinksinput …

MIT 6.s081 实验解析——labs1

系列文章目录 MIT 6.s081 实验解析——labs1 文章目录 系列文章目录测试判断流程sleep 未完待续 测试判断流程 完成代码后将.c文件放入user文件夹中在makefile文件的UPROGS处添加要测试的文件&#xff0c;如要添加的是sleep.c&#xff0c;则写为_sleep。 重新编译xv6 make q…

亚马逊圣诞关键词怎么选?圣诞节促销活动有哪些?——站斧浏览器

亚马逊圣诞关键词怎么选 以下是在亚马逊圣诞期间利用长尾关键词的一些建议&#xff1a; 圣诞主题关键词&#xff1a;随着节日的临近&#xff0c;与圣诞相关的关键词搜索热度将急剧上升。在产品标题、描述、关键词等位置使用与圣诞节相关的关键词&#xff0c;比如“圣诞礼物”…

自动化测试工具-Selenium:WebDriver的API/方法使用全解

我们上一篇文章介绍了Selenium的三大组件&#xff0c;其中介绍了WebDriver是最重要的组件。在这里&#xff0c;我们将看到WebDriver常用的API/方法&#xff08;注&#xff1a;这里使用Python语言来进行演示&#xff09;。 1. WebDriver创建 打开VSCode&#xff0c;我们首先引…

金融CRM有用吗?金融行业CRM有哪些功能

市场形式波诡云谲&#xff0c;金融行业也面临着资源体系分散、竞争力后继不足、未知风险无法规避等问题。金融企业该如何解决这些问题&#xff0c;或许可以了解一下CRM管理系统&#xff0c;和其提供的金融行业CRM解决方案。 金融行业是银行业、保险业、信托业、证券业和租赁业…

2023年终总结 | 四平八稳

年度回顾 年度关键词&#xff1a;四平八稳 百科解读&#xff1a;形容物体放置的平稳或言行稳当&#xff1b;也指做事但求无过&#xff0c;不思进取。 我在写这篇文章就在思考用什么关键词来描述我过去这一年&#xff0c;似乎这一年没有特别让我特别惊喜的事情&#xff0c;无论是…