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问题。代码段环境正在强制您的URLhttps://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))
})()