解决js脚本加载失败的问题

这篇具有很好参考价值的文章主要介绍了解决js脚本加载失败的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当我们在运行某一个项目时,它的某些JavaScript脚本可能加载不出来,报错。 像现在单页界面应用基本上都是通过js来构建,一旦加载不出,这个项目就不能运行了,那怎么办?我们如何解决这个问题?

解决js脚本加载失败的问题

这里采用的方案是,重新加载JavaScript脚本。那么什么时候去重新加载js,如何重新加载js?在js脚本加载不出来时,就需要去重试加载。那我们怎么知道js有没有加载失败,我们可以在<script src="https://cdn.topskys.org/v0/loadjs.js"></script>标签上添加一个监听加载失败的事件 οnerrοr="console.log('error')",当出现错误会触发onerror事件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script onerror="console.log('error')" src="https://cdn.topskys.org/v0/loadjs.js"></script>
</body>
</html>

解决js脚本加载失败的问题

 可以看到,当加载js出现错误时,onerror监听到了错误。但是在工程化的环境,这些<script></script>标签元素都是自动生成的,给这些标签添加上onerror事件,这种方式又特别麻烦。我们可以给整个window添加error监听事件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="https://cdn.topskys.org/v0/loadjs.js"></script>
    <script>
        window.addEventListener("error",e=>{
            console.log("error loading")
        });
    </script>
</body>
</html>

但上一个js脚本加载出现错误,window监听error事件还有没有注册,所以说我们需要把它写在最前边,放到<head></head>里,一开始就去监听。当然,写到最前边它也不会触发,因为它不会事件冒泡,只能在捕获阶段就拿到该事件,在监听事件函数后加“, true”:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.addEventListener("error", e => {
            console.log("error loading")
        },true); // 捕获阶段拿到事件
    </script>
</head>

<body>
    <script src="https://cdn.topskys.org/v0/loadjs.js"></script>
</body>

</html>

解决js脚本加载失败的问题

 触发error的事件类型也很多,如图片加载错误、在js中throw 1报错也会触发error。我么怎么样缩小触发error的范围,只监听到那些<script src=""></script> 加载js不出来的情况?我们发现error事件中,参数e输入的target是script元素:

解决js脚本加载失败的问题

 但是呢,throw 在error事件里报的是ErrorEvent错误,里面包含各种属性,故我们可以准确地找到某一种错误。

    <script>
        throw 1;
    </script>

解决js脚本加载失败的问题

 我们需要在window监听error事件里面作一个判断:

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.addEventListener("error", e => {
            const tag=e.target
            if(tag.tagName==='SCRIPT' && !(e instanceof ErrorEvent)) {
                console.log("JS 加载错误")
            }
        },true);
    </script>
</head>

到这里页面解决了,什么时候去重新加载js的问题,还剩下如何重试加载js。

首先,我们需要引入多个新地址的script标签加载js,当某一个js加载失败时,就会被触发window监听事件error,执行重试更换域名生成新的script标签加载js,需要靠document.write()才能阻塞后面的js加载,不阻塞后续js加载,会造成js加载顺序混乱。

注意,在使用document.write()写入script标签时,需要对标签结束符进行转译,否则会被认为是上个标签的结束符。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        const domains = ["https://cdn.topskys.org/v0", "https://cdn.topskys1.org/v1", "https://cdn.topskys2.org/v2"]; // 重试域名数组
        const maxRetry=3; // 最多重试次数 
        const retryInfo={}; // 记录重试次数及下一个重试的域名数组下标{times:1,nextIndex:2}
        window.addEventListener("error", e => {
            const tag = e.target
            if (tag.tagName === 'SCRIPT' && !(e instanceof ErrorEvent)) {
                // console.log("JS 加载错误")
                const url=new URL(tag.src) // 拿到script标签的src域名
                if(!retryInfo[url.pathname]){
                    retryInfo[url.pathname]={
                        times:0,
                        nextIndex:0,
                    }
                }
                const info=retryInfo[url.pathname]; // 取出文件路径 ./loadjs.js ./js.js ./y.js
                 const script=document.createElement("script")
                 url.host=domains[info.nextIndex]; // 更换域名
                 document.write(`<script src="${url.toString()}">\<\/script>`); //  新加载script元素,需要阻塞后面的script加载js,否则加载js顺序会乱。注意转译</script>,否则会被认为上面的script结束标签。
                 script.src=url.toString(); 
                 document.body.insertBefore(script,tag); // 将新的script标签插入加载错误标签前
                //  修改重试信息
                info.times++;
                info.nextIndex=(info.nextIndex+1)%domains.length;
            }
        }, true);
    </script>
</head>

<body>
    <script src="https://cdn.topskys.org/v0/js.js"></script>
    <script src="https://cdn.xx1.cn/y.js"></script>
    <script src="https://cdn.xx2.com/loadjs.js"></script>
</body>

</html>

那么,如何解决js加载失败的问题就解决了。但如果script标签上有defer、async及工程化项目中呢,有如何该解决?

复制此链接,打开Dou音搜索,直接观看视频!

 文章来源地址https://www.toymoban.com/news/detail-484183.html

到了这里,关于解决js脚本加载失败的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决QWebEngineView在linux下加载本地html失败的问题

    通常我们使用QWebEngineView加载本地html文件时,是通过 两个函数,传入html的相对或绝对路径,进行加载。 而在linux(uos x86)下运行时,却发现加载失败,变成空白页面。查了半天原来linux下需要在路径前面加上\\\"file://\\\"。比如,对于路径\\\"/home/code/test/test.html\\\",则需要改成\\\"file:///home

    2024年02月13日
    浏览(40)
  • Jenkins 教程|完美解决Jenkins安装失败、运行失败和账号丢失问题

    😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊 座右铭:不想当开发的测试,不是一个好测试✌️。 如果感觉博主的文章还不错的话,还请点赞、收藏哦

    2024年02月07日
    浏览(38)
  • [虚幻引擎][UE]BlueprintWebSockets插件打包失败或打包成功运行失败问题解决方法

    错误内容: Plugin ‘EasyWebsockets’ failed to load because module ‘EasyWebsockets’ could not be found. Please ensure the plugin is properly installed, otherwise consider disabling the plugin for this project. UATHelper: Packaging (Windows 64 bi t ) ERROR: Missing pr ecompiled manifest for’EasyWebsockets’. This module was most likely not flagg

    2024年02月16日
    浏览(38)
  • 解决Android Studio的模拟器运行失败的问题

     前面搭建了Android Studio的开发环境,第一次安装在默认路径下。新建工程之后想用模拟器运行测试一下,但是模拟器总是运行不成功。在网上也按照一些建议,重新安装HAXM,怎么折腾都不成功。 后来,干脆卸载了Android Studio,重新安装,并指定路径到E盘下,进行正常的设定

    2024年02月14日
    浏览(44)
  • js,jquery解决 图片加载-滚动底部 问题

    问题描述 :让图片加载完成后,再执行滚动函数,避免出现图片加载一半的时候,滚动下来底部只出现半张图片。 这里记录4种测试成功方式: (适用于不容易找到图片位置的情况,否则直接onload函数即可)

    2024年01月18日
    浏览(27)
  • 解决stable diffusion webui1.6 wd1.4 tagger加载失败的问题

    由于webui源码的变化,需要修改两个地方的import

    2024年02月08日
    浏览(26)
  • unity学习遇到的问题:解决VS不能加载Unity脚本,MonoBehaviour是灰色的

    电脑出了点问题,然后就重装了,重装之后,从gitee上下载了原来的半截代码,结果发现里面的脚本运行出问题了,仔细一看,MonoBehaviour是灰色的,也就是说,加载不了unity的api了,下面是找到的解决方法,让我们感谢Leoysq大大写的这个方法 这里只写我的解决方法:

    2024年02月07日
    浏览(52)
  • 基于linux下的高并发服务器开发(第一章)- 解决动态库加载失败的问题1.8

    1、获取当前动态库所在路径 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/Linux/lesson06/library/lib  ldd main ./main (1)先进入到~目录下  (2)在此目录下输入ll命令,打印内容如下,我们可以看到有一个.bashrc  (3)配置.bashrc文件,命令vim .bashrc  (4)shift+g,跳到最后一行,按住i键

    2024年02月16日
    浏览(35)
  • Pycharm中导入matplotlib,解决matplotlib在Pycharm中运行失败的问题

    首先,我们在anaconda命令窗口中安装matplotlib,使用pip命令 这时候我们在Pythorm中写一段代码 运行就会报错 我们首先查看python解释器里面matplotlib的版本 会发现我们刚刚pip安装的是3.7.0,但是pycharm中的是3.6.2,所以需要在pycharm中再次安装 双击matplotlib,进入到如下界面,点击I

    2024年02月11日
    浏览(40)
  • HarmonyOS开发:解决DevEco Studio低版本导入高版本项目运行失败问题

    基于 DevEco Studio 4.0 Beta2,hvigorVersion为3.0.2 ,开发了一个项目,上传到了远程仓库,当同事下载后,却始终无法运行,频繁报错,由于API都是使用的9,第一感觉就是开发环境不同,于是,让其发来了他的开发环境, DevEco Studio 3.1.1 Release,hvigorVersion为2.4.2 ,果然是环境不同

    2024年02月05日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包