【发布时间】:2010-06-13 15:16:42
【问题描述】:
我正在尝试编写一个超简单的解决方案来异步加载一堆 JS 文件。到目前为止,我有以下脚本。但是,有时会在脚本未实际加载时调用回调,这会导致未找到变量错误。如果我有时刷新页面它只是工作,因为我猜文件直接来自缓存,因此比调用回调更快,这很奇怪?
var Loader = function () {
}
Loader.prototype = {
require: function (scripts, callback) {
this.loadCount = 0;
this.totalRequired = scripts.length;
this.callback = callback;
for (var i = 0; i < scripts.length; i++) {
this.writeScript(scripts[i]);
}
},
loaded: function (evt) {
this.loadCount++;
if (this.loadCount == this.totalRequired && typeof this.callback == 'function') this.callback.call();
},
writeScript: function (src) {
var self = this;
var s = document.createElement('script');
s.type = "text/javascript";
s.async = true;
s.src = src;
s.addEventListener('load', function (e) { self.loaded(e); }, false);
var head = document.getElementsByTagName('head')[0];
head.appendChild(s);
}
}
是否有办法测试 JS 文件是否已完全加载,而不在实际的 JS 文件本身中添加任何内容,因为我想使用相同的模式来加载不受我控制的库(GMaps 等)。
调用代码,就在标记之前。
var l = new Loader();
l.require([
"ext2.js",
"ext1.js"],
function() {
var config = new MSW.Config();
Refraction.Application().run(MSW.ViewMapper, config);
console.log('All Scripts Loaded');
});
感谢您的帮助。
【问题讨论】:
-
你在哪个浏览器和版本中测试这个?
-
在最新的 WebKit 中,在最新的开发版 Chrome 中也是如此 :(
-
我无法使用 Chromium 5.0.375.70 重现这一点,从 CDN 加载两个脚本,从 localhost 加载一个脚本(包含执行回调函数内的一行所需的函数)。但是
async标志真的有必要吗?如果您将s.async = true;评论出来会怎样? -
是的,真正的异步只是不需要。谢谢:)
-
@galambalazs 该脚本用于移动网络应用程序,幸运的是 IE 不是问题:D
标签: javascript ajax asynchronous design-patterns