我有一个用例,我有一个延迟加载的JS文件。在开发过程中,这个JS文件将是文件A和文件B的组合。但是在生产中它应该加载文件A然后加载文件B进行分离。 使用
将它们直接添加到DOM时,这可以正常工作for(int i =0; i < urls.length; i++) {
document.write("<script type='text/javascript' src='" + urls[i] + "'></script>");
}
即使FileB在FileA之前加载,也不会首先评估它。
我的代码如下
createScript: function(url, id) {
var m = this;
// flag as loaded
var myonload = function() {
Logger.debug(formatMessage(Library.RESOURCES["load.success"], [this.src, id]), "core");
this.library_loaded = true;
};
// log loading error
var myonerror = function() {
Logger.warn(formatMessage(Library.RESOURCES["load.failure"], [this.src, id]), "core");
};
//If currently being grabbed
// || m.currentAsyc[ids[i]+"/async"]
if (Library.findScript(url))
return;
var script = document.createElement("script");
script.type = "text/javascript";
script.library_loaded = false;
// mozilla
script.onload = myonload;
script.onerror = myonerror;
// ie
script.onreadystatechange = function() {
if (this.readyState == "complete" || this.readyState == "loaded") {
setTimeout(myonload.bindAsEventListener(this), 10);
this.onreadystatechange = null;
}
};
script.src = url;
m.head.appendChild(script);
},
这导致DOM具有
<script type="text/javascript" src="/path/to/FileA"></script>
<script type="text/javascript" src="/path/to/FileB"></script>
但是当FileB加载得更快,然后FileA首先尝试评估自己。 有什么方法可以防止这种情况吗?
进一步解释
我正在尝试将类似Sprockets的功能实现到遗留系统中。 当我通常要求'/ dyn / path / to / FileA'时,它会有 // =要求顶部的FileB发送
的响应document.write("<script type="text/javascript" src="/path/to/FileA"></script>");
document.write("<script type="text/javascript" src="/path/to/FileB"></script>");
这很有效,因为它同步进行调用。 在这种情况下,我进行了一次AJAX调用,以查看动态FileA需要哪些文件(那些文件是FileA和FileB)。这返回说我们需要请求FileA和FileB。问题是我需要回调以确认何时实际加载了这两个文件,因为我对其他需要此代码的区域也有等待功能。他们目前正在等待/ dyn / path / to / FileA完成加载,但我们现在需要他们等待FileA和FileB完成加载。