我正在尝试编写一个简单的依赖项加载器,而我在测试库时遇到问题,看看初始加载是否成功。主要障碍似乎是由于我将每个库的var名称存储为字符串。
var libraries = [
{
libvar: 'jQuery',
cdn: '//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js',
fileName: 'jquery-2.1.4.min'
}, {
libvar: '_', // Underscore.js
cdn: '//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js',
fileName: 'underscore-1.8.3.min'
}
];
var checkLoad = function(library) {
if (!library || !library.fileName.length) return;
document.addEventListener('DOMContentLoaded', function() {
var thisLib = eval(library.libvar);
if (!thisLib) {
script = document.createElement('script');
script.setAttribute('src', 'js/fallback/' + library.fileName + '.js');
script.setAttribute('type', 'text/javascript');
document.body.appendChild(script);
console.warn(library.libvar + ' loaded via fallback', thisLib); // Testing
} else {
console.warn(library.libvar + ' is loaded!'); // Testing
}
});
};
for (var i = 0; libraries.length > i; i++) {
document.write(unescape("%3Cscript src='" + libraries[i].cdn + "' type='text/javascript'%3E%3C/script%3E"));
checkLoad(libraries[i]);
}
我得到的错误是:
未捕获的ReferenceError:未定义jQuery
...其中“jQuery”只是我手动破解的链接的eval(library.libvar)的名称。
如果脚本从cdn成功加载,初始加载和测试工作正常。但是如果我手动断开cdn链接,脚本就会尝试回退,而是抛出一个js错误并停止。
我正在努力弄清楚如何编写一个合适的测试,如果没有错误并停止一切就会失败。
根据dbrin的解决方案,固定的DOMContentLoaded函数看起来像这样:
document.addEventListener('DOMContentLoaded', function() {
if (!window[library.libvar]) {
var script = document.createElement('script');
script.setAttribute('src', 'js/fallback/' + library.fileName + '.js');
script.setAttribute('type', 'text/javascript');
document.body.appendChild(script);
}
});
答案 0 :(得分:2)
以下是一个例子:
if(window['jQuery']) {
// Hooray jQuery is loaded!
}
答案 1 :(得分:0)
注意库(通常)库根对象如何成为全局window
对象的属性,我建议您执行以下操作:
var thisLib = eval("window." + library.libvar);
这样if检查不应该失败。