НЕ ДУБЛИКАТ, КАК Я ДОЛЖЕН НАЙТИ УДОВЛЕТВОРИТЕЛЬНЫЙ ОТВЕТ НА ДРУГИЕ РЕЗЬБЫ:
- Загрузите и выполните javascript-код SYNCHRONOUSLY
- Загрузка выполнения HTML и Script
- Загрузите и выполните javascript-код SYNCHRONOUSLY
Ищите собственные Javascript ответы, нет jQuery, no requireJS и т.д., пожалуйста:)
РЕЗЮМЕ ВСЕГО ВОПРОСА:
Я хочу асинхронно загружать скрипты, но заказывать исполнение
Я пытаюсь обеспечить, чтобы код во вставленных элементах Script выполнялся точно в том же порядке, поскольку они были добавлены в дерево dom.
То есть , если я вставляю два Script тега, первый и второй, любой код в первом должен стрелять до второго, независимо от того, кто заканчивает загрузку первым.
Я пробовал с атрибутом async и отложить при вставке в голову, но, похоже, не подчиняется.
Я попытался использовать element.setAttribute( "defer", ") и element.setAttribute(" async", false) и другие комбинации.
Проблема, которую я испытываю в настоящее время, должна выполняться при включении внешнего script, но это также единственный тест, который я выполнил там, где есть латентность.
Второй script, который является локальным , всегда запускается перед первым, даже если он вставлен впоследствии в дереве dom (head).
A) Примечание, что я все еще пытаюсь вставить оба элемента Script в 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);
})
Если вы попробуете приведенный выше код в виде firebug, чаще всего он будет стрелять 2, а затем 1. Я хочу обеспечить 1, а затем 2, но включить оба в голову.