Синхронные <script> заявления?
Я использую xmlhttprequest
(и eval
) для динамической загрузки скриптов. Затем я оцениваю script и смотрю, есть ли другие загружаемые сценарии. По пути, если какой-либо из сценариев вызывает и исключение, сообщение об ошибке указывает номер строки, связанный с eval
, а не с фактической ошибкой в script.
В еще один вопрос было предложено использовать <script>
вместо этого, чтобы получить более эффективные сообщения об ошибках. К сожалению, <script>
является асинхронным, и я не буду контролировать порядок загрузки скриптов (мне нужен обратный вызов onload
).
Как реализовать синхронное поведение в командах <script>
Дополнительная информация о том, к чему я стремился достичь
Каждый script имеет список других загружаемых им скриптов, хранящихся в списке, позволяет называть его _toLoad
Предположим, что у нас есть script 'Main.js' с таким списком загрузки
_toLoad = [['A.js'] , ['B.js'] , ['C.js'] , ['D.js' , 'E.js' , 'F.js']]
В котором указано, что после загрузки файл "A.js" должен быть загружен следующим образом. Когда загружается "A.js", затем загружается "B.js" . Когда загружается "B.js" , загружается "C.js". Когда загружается "C.js", "D.js", "E.js" и "F.js" должны быть загружены в любом порядке.
Я мог бы использовать <script>
для загрузки "Main.js", оценить его _toLoad
и начать загрузку других скриптов в правильном порядке. Но что произойдет, если "A.js" имеет несколько скриптов, которые он также загружает? Я хочу, чтобы те загружались в фоновом режиме и не задерживали "B.js" от загрузки
Что делать, если "A.js" имеет список загрузки следующим образом:
_toLoad = [['A2.js'] , ['B2.js'] , ['C2.js'] , ['D2.js' , 'E2.js' , 'F2.js']]
Мне нужно будет пройти и выпустить для них теги <script>
. Это похоже на первый подход к глубине, когда я хочу сначала получить форму ширины.
Ответы
Ответ 1
Один из связанных вопросов, связанных с установкой innerHTML элемента тега script. Я думаю, что это может сделать трюк
function load(toEval, callback){
__global_callback = callback;
var node = document.createElement('script');
node.innerHTML = toEval + '; __global_callback()';
document.getElementsByTagName('head')[0].appendChild(node);
}
load("console.log('before...');", function(){
console.log('...and after');
});