Есть ли известный обходной путь для порядка выполнения тегов в IE9? - PullRequest
3 голосов
/ 19 августа 2011

Я уверен, что не до конца понимаю эту проблему, но кажется , что мы наблюдаем странное поведение IE9 в моем проекте, каким-то образом связанное с неупорядоченным выполнением JavaScript, вводится через звонки на document.write, например:

document.write('<scr'+'ipt type="text/javascript" src="'+file1+'"></src'+'ipt>');
document.write('<scr'+'ipt type="text/javascript" src="'+file2+'"></src'+'ipt>');
document.write('<scr'+'ipt type="text/javascript" src="'+file3+'"></src'+'ipt>');

Мое ограниченное исследование Google показывает, что IE9 будет выполнять сценарии, введенные таким образом, в другом порядке, чем в других браузерах (в частности, Firefox и Chrome). Есть ли лучший способ добиться того, к чему мы стремимся, который обеспечит одинаковый порядок выполнения всеми браузерами?

Я забираю это: нас не волнует все браузеры, только Chrome и IE9.

Ответы [ 4 ]

5 голосов
/ 19 августа 2011

Полагаю, вы могли бы связать событие onload одного для запуска загрузки другого:

var newJS= document.createElement('script');
newJS.onload=function() {alert("done")} //or call next load function
newJS.src="..."
document.body.appendChild(newJS)
5 голосов
/ 23 августа 2011

Используйте загрузчик скриптов (например, тот, который я написал: LABjs ), который нормализует все разные особенности загрузки в разных браузерах. И бонус: он не использует этот ужасный document.write (). LABjs позволит вам загружать все ваши сценарии асинхронно (параллельно), но убедитесь, что они выполняются в правильном порядке. Похоже, в основном именно то, что вы хотите.

2 голосов
/ 19 августа 2011

Таким образом, преимущество написания тегов сценария таким образом заключается в том, что они загружаются асинхронно . Я не знаю о нюансах браузера о том, как именно это делается, но я бы подумал, что они будут выполнены, когда они будут загружены, в произвольном порядке. Аналогично поведению атрибута HTML5 async .

Есть еще один HTML5-атрибут defer, который вместо этого заставляет сценарии выполняться по порядку, но не блокирующим образом. Вы можете попробовать добавить это в сгенерированные теги <script>. IE9 частично соблюдает его .

0 голосов
/ 27 ноября 2015

Я сделал небольшой скрипт, специально для этой цели:

https://github.com/mudroljub/js-async-loader

Короче говоря, он загружает все ваши сценарии асинхронно, а затем последовательно выполняет их. Это выглядит примерно так:

for (var lib in libs) {
    loadAsync(lib);
}

А тебе не нужно document.write();

...