JavaScript ES6动态加载类并检查是否已加载?

JavaScript ES6动态加载类并检查是否已加载?,javascript,es6-class,Javascript,Es6 Class,我正在尝试动态加载一个类,并检查它以前是否加载过。 下面的代码不起作用,你知道为什么吗 我无法理解为什么这部分不起作用: if (typeof window['Car'] == 'undefined') 完整资料来源: if(车窗类型['Car']=='undefined'){ 警报(“车辆类别未加载!”); } var head=document.getElementsByTagName('head')[0]; var script=document.createElement('scri

我正在尝试动态加载一个类,并检查它以前是否加载过。
下面的代码不起作用,你知道为什么吗

我无法理解为什么这部分不起作用:

if (typeof window['Car'] == 'undefined')
完整资料来源:

if(车窗类型['Car']=='undefined'){
警报(“车辆类别未加载!”);
}
var head=document.getElementsByTagName('head')[0];
var script=document.createElement('script');
script.src=http://m.uploadedit.com/bbtc/1572125047736.txt';
script.type='text/javascript';
head.append(脚本);
setTimeout(函数(){
如果(车窗类型['Car']=='undefined'){
警报(“即使在X秒后,车辆等级未加载!”);
}否则{
警报(“X秒后,车辆装载!”);
} 
}, 3000);

像插入脚本一样动态插入脚本以异步方式运行脚本,以便在动态加载的脚本完成加载并执行之前检查加载的类

您可以使用
script.onload
查找脚本何时完成加载,然后检查回调中是否存在您的类

此外,
构造函数不会添加到
窗口
对象,因此您必须更改测试其存在性的方式,如下所示

var head = document.getElementsByTagName('head')[0];

var script = document.createElement('script');
script.src = 'http://m.uploadedit.com/bbtc/1572125047736.txt';
script.type = 'text/javascript';
script.onload = function() {
    if (typeof Car === "function") {
        alert("Car class loaded!");
    } else {
         alert("Car class not loaded!");
    }
}

head.append(script);
在此进行工作演示:


如果希望能够将要测试的类名存储在变量中,可以这样做:

function testClass(cls) {
  return eval("typeof " + cls + " === 'function'");
}

var head = document.getElementsByTagName('head')[0];

var script = document.createElement('script');
script.src = 'http://m.uploadedit.com/bbtc/1572125047736.txt';
script.type = 'text/javascript';
script.onload = function() {
  let cls = "Car"
  if (testClass(cls)) {
    alert("Car class loaded!");
  } else {
    alert("Car class not loaded!");
  }
}

head.append(script);
在此进行工作演示:


注意:必须通过
http://
访问这些工作演示,因为它们试图加载OP提供的脚本,而该脚本仅可用
http://
。因此,它们不能在这里显示为stackoverflow片段(脚本资源需要
https://
)。这就是为什么他们要使用JSFIDLE演示。

四件事!您的代码可能还可以,这与服务器更相关


您的文件是mime类型text/plain。应该是

HTTP/1.1200ok

内容长度:162

内容类型:文本/普通

最后修改:2019年10月26日星期六21:24:07 GMT


您的文件是通过http而不是https提供的。当您的页面作为https使用时,浏览器可能会阻止

如果您的网站提供HTTPS页面,则所有活动的混合内容 默认情况下,此页面上通过HTTP传递的内容将被阻止。 因此,用户可能会认为您的网站已损坏


你的文件没有提供一个。如果您的页面在https上运行,则您的浏览器正在阻止:

fetch("http://m.uploadedit.com/bbtc/1572125047736.txt")
已阻止跨源请求:同一源策略不允许读取 位于的远程资源 . (理由:CORS请求 没有成功)


!

使用错误处理:

(async () => {
    await import('//.../synth/BubbleSynth.js').catch((error) => console.log('Loading failed' + error))
})()

@user648026-在Chrome中,您的JSFIDLE显示以下错误:“(索引):48混合内容:位于“”的页面是通过HTTPS加载的,但请求了一个不安全的脚本“”。此请求已被阻止;内容必须通过HTTPS提供。“@user648026-您的脚本存在另一个问题。声明的
不会放在
窗口
对象上。它们在浏览器的全局范围内可用,但不在
窗口
对象上可用。我已经修改了我的代码,以更改正在加载的
Car
的测试,现在它可以工作了。@user648026-好的,你没有回答这个问题。我所知道的唯一一种测试方法是,当您只有一个字符串时,它将涉及
eval()
newfunction()
。您需要将
typeof
代码(插入动态类名)构造到您构建的一些代码中,然后
eval()
它。或者更改导入文件中的方案,将类名作为属性手动添加到已知的全局符号中,例如
myClasses
,然后在字符串中使用
if(typeof myClasses[someClassName]==“function”)
来运行测试。@user648026-动态加载,是的。你没有说你要查的名字不知道。无论如何,我认为您必须使用
eval()
,除非您将动态加载的代码分配给已知的全局类。然后,您可以检查该全局变量的属性。@user648026-我不明白您还在处理什么问题。计时器什么也不做。问题中的代码段不起作用有两个原因:1)
window['Car']
对于
类永远不起作用,因为类名称没有放在window对象上;2)代码段存在https问题。代码段环境正在强制您的URL
https://m.uploadedit.com/bbtc/1572125047736.txt
这不起作用。我不知道你还想从我这里得到什么。我已经告诉你问题出在哪里了。不知道你为什么提到CORs和
fetch()
。OP使用了一个
标记,当他们没有htttp/https问题时,该标记可以正常工作。此外,这似乎根本没有解决OP所询问的问题,即检测到动态加载的类。
(async () => {
   await import('//.../synth/BubbleSynth.js')
})()
(async () => {
    await import('//.../synth/BubbleSynth.js').catch((error) => console.log('Loading failed' + error))
})()