不是重复的,因为我还没有在其他线程上找到令人满意的答案:
寻找原生 Javascript答案,没有 jQuery,没有 requireJS,等等:)
整个问题的总结:
我想异步加载脚本但已下令执行
我试图强制插入的脚本元素中的代码完全按照它们添加到 dom 树的顺序执行。
也就是说,如果我插入两个脚本标签,第一个和第二个,无论谁先完成加载,第一个中的任何代码都必须在第二个之前触发。
我在插入头部时尝试了async属性和defer属性,但似乎没有遵守。
我试过 element.setAttribute("defer", "") 和 element.setAttribute("async", false) 和其他组合。
我目前遇到的问题是在包含外部脚本时必须做的,但这也是我在有延迟的情况下执行的唯一测试。
第二个脚本是本地脚本,总是在第一个脚本之前触发,即使它后来被插入到 dom 树( head )中。
A)请注意,我仍在尝试将两个脚本元素插入 DOM。当然上述可以通过先插入来实现,让它完成并插入第二个,但我希望有另一种方法,因为这可能会很慢。
我的理解是 RequireJS 似乎就是这样做的,所以它应该是可能的。但是,requireJS 可能会按照 A) 中的描述进行操作。
如果您想直接在 firebug 中尝试代码,只需复制并粘贴:
function loadScript(path, callback, errorCallback, options) {
var element = document.createElement('script');
element.setAttribute("type", 'text/javascript');
element.setAttribute("src", path);
return loadElement(element, callback, errorCallback, options);
}
function loadElement(element, callback, errorCallback, options) {
element.setAttribute("defer", "");
// element.setAttribute("async", "false");
element.loaded = false;
if (element.readyState){ // IE
element.onreadystatechange = function(){
if (element.readyState == "loaded" || element.readyState == "complete"){
element.onreadystatechange = null;
loadElementOnLoad(element, callback);
}
};
} else { // Others
element.onload = function() {
loadElementOnLoad(element, callback);
};
}
element.onerror = function() {
errorCallback && errorCallback(element);
};
(document.head || document.getElementsByTagName('head')[0] || document.body).appendChild(element);
return element;
}
function loadElementOnLoad(element, callback) {
if (element.loaded != true) {
element.loaded = true;
if ( callback ) callback(element);
}
}
loadScript("http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js",function() {
alert(1);
})
loadScript("http://ajax.googleapis.com/ajax/libs/chrome-frame/1.0.3/CFInstall.min.js",function() {
alert(2);
})
如果您像萤火虫一样尝试上面的代码,大多数情况下它会触发 2,然后是 1。我想确保 1 和 2,但将两者都包含在头部。