当前位置: 首页 > 知识库问答 >
问题:

react.js - 动态引入script报错怎么解决?

贾飞鸿
2023-06-06

循环调用一组函数,动态引入script,在检查元素中的head中script显示已经被引入,但是onload函数没有被执行,并且报错如下:

export async function loadScripts(scripts: string[], callback: any) {
    let HEAD = document.getElementsByTagName('head')[0]
    let s = [];
    let loaded = 0;
    for (let i = 0; i < scripts.length; i++) {
        s[i] = document.createElement('script');
        s[i].setAttribute('type', 'text/label'); 
        s[i].setAttribute('src', scripts[i]);
        s[i].onload = () => {
            // error: Function declared in a loop contains unsafe references to variable(s) 'loaded'
            loaded++;
            if (loaded === scripts.length) {
                callback()
            }
        };
        HEAD.appendChild(s[i]);
    }
}

共有3个答案

古扬
2023-06-06

image.png

这是个啥类型?你打算让浏览器按什么规则去解析它?

P.S.1 那是个 eslint 警告,闭包问题,你应该用一个立即执行函数包裹执行。你也可以选择忽略它,其实你这么写没啥问题,你又不拿它当返回值。但 eslint 比较死板。

P.S.2 想拿 head 元素,直接用 document.head 就好了。

白弘伟
2023-06-06
export async function loadScripts(scripts: string[], callback: any) {
    let HEAD = document.getElementsByTagName('head')[0]
    let s = [];
    let loaded = 0;
    for (let i = 0; i < scripts.length; i++) {
        s[i] = document.createElement('script');
        s[i].setAttribute('type', 'text/label'); 
        s[i].setAttribute('src', scripts[i]);
        s[i].onload = (function(index) {
            return function() {
                loaded++;
                if (loaded === scripts.length) {
                    callback()
                }
            }
        })(i);
        HEAD.appendChild(s[i]);
    }
}
郭通
2023-06-06

你注释的那个报错是eslint的规则no-loop-func导致的

不过你下面的代码也有问题呀,执行必报错,c[i] 是 undefined,c[i].onload 浏览器会提示

Uncaught TypeError: Cannot set properties of undefined (setting 'onload')
 类似资料:
  • <script setup lang="ts">再引入1个<script src="..."></script>,报错,请问怎么解决? 错误提示: ERROR <script> cannot use the "src" attribute when <script setup> is also present because they must be processed together.

  • v-for里面,有一段代码是这样的 结果出现一下报错 如果我是写死这个路径,又是正常的,用变量就不行,用函数return也不行,请问怎么解决呢?

  • webpack5 打包时候会报几个这种问题,怎么解决

  • 有没有大佬来帮我看一看,是关于github actions的,我在实现一个推送代码到指定分支上时,会自动触发在远程目标服务器上面部署运行springboot项目,但是每一次运行到以下代码的时候: 它就会一直卡在这里。但是事实上,这一个项目是被正确运行了,监听端口也有信息,但是工作流中会报错: 我有一点不明白,部署成功之后,不就是应该断开ssh连接吗?有没有大佬解决一下? 因为这个地方报错,所以它工

  • VUE3项目中,文件夹名修改了大小写,就报错。 一开始组件是cleanData/form.vue,我重命名为CleanData/editForm.vue。引入组件时,还提示之前的form.vue,选择editForm.vue之后就报错(第二张图) 报错说仅大小写不同,重启项目也没用。为啥会这样呢? 我百度试了不写.vue也不行:

  • eslint版本 9.9.0 vite版本 5.4.1 在vite中,配置了自动引入,但是eslint还是会报错ESLint: 'useState' is not defined.(no-undef),eslint应该怎么配置,求大佬告知 希望可以不用没有都写import { useState } from "react"这种引入