Я добавляю несколько меток <script>
динамически к элементу головы после загрузки страницы. Я понимаю, что сценарии загружаются асинхронно, но могу ли я ожидать, что они будут разбираться в том порядке, в котором они добавлены?Необходимо добавить динамическое дополнение к скрипту?
Я вижу ожидаемое поведение в Firefox, но не в Safari или Chrome. Глядя на документ в Chrome инструменты для разработчиков и Firebug, как показывают следующее -
<html>
<head>
...
<script type="text/javascript" src="A.js"></script>
<script type="text/javascript" src="B.js"></script>
</head>
...
</html>
Однако, глядя на вид загрузки ресурсов, хром, кажется, разобрать какой возвращается первый из сервера, в то время как поджигатель всегда загружает их в заказать теги сценария, даже когда B сначала возвращается с сервера.
Следует ли ожидать, что Chrome/Safari проанализирует файлы в указанном порядке? Использование Chrome 5.0.375.29 беты на OS X 10.6.3
EDIT (10/5/10): Когда я говорю, разобран, я имею в виду выполнить - можно увидеть много преимуществ агрессивного разбора - THx rikh
EDIT (11/5/10): Хорошо, поэтому я собрал тест в соответствии с тем, что указано juandopazo. Однако я добавил комбинацию вещей, включая
- Добавление элемента скрипта в голову непосредственно с помощью javascript. (Тесты A -> D)
- Добавление элемента сценария в голову с использованием метода append() jquery. (Тесты E -> H)
- 'Загрузка' скрипта с помощью метода jScript для getScript(). (Тесты I -> L)
Я также пробовал все комбинации атрибутов «async» и «defer» в тегах скриптов.
Вы можете получить доступ к тесту здесь: http://dyn-script-load.appspot.com/ и просмотреть источник, чтобы узнать, как он работает. Загруженные скрипты просто вызывают функцию update().
Первое, что нужно отметить, это то, что только один и третий методы выше работают параллельно - второй выполняет запросы последовательно. Вы можете увидеть график этого здесь -
Изображение 1 - График запроса Lifecycle
Request lifecycle Graph http://dyn-script-load.appspot.com/images/dynScriptGraph.png
Интересно также, что JQuery Append() подход также блокирует getScript() звонки - вы можете видеть, что ни один из они выполняются до тех пор, пока все вызовы append() не будут завершены, а затем все они будут выполняться параллельно. В заключение отметим, что метод jQuery append(), по-видимому, удаляет теги сценария из головки документа после их выполнения. Только первый метод оставляет теги сценария в документе.
Chrome Результаты
Результаты, что Chrome всегда выполняет первый сценарий для возврата, независимо от теста. Это означает, что все тесты «fail», за исключением метода jQuery append().
Изображение 2 - Chrome 5.0.375.29 бета Результаты
Chrome Results http://dyn-script-load.appspot.com/images/chromeDynScript.png
Firefox Результаты
На светлячок, однако, оказывается, что, если первый метод используется, и асинхронной ложно (т.е. не установлен), то сценарии будут надежно выполнять в заказ.
Изображение 3 - FF 3.6.3 Результаты
FF Results http://dyn-script-load.appspot.com/images/ffDynScript.png
Обратите внимание, что сафари, кажется, дает различные результаты в том же образом, как и хром, который имеет смысл.
Кроме того, у меня есть только 500 мс задержки на медленном скрипте, просто чтобы время начала -> закончилось. Возможно, вам придется немного обновиться, чтобы увидеть, как Chrome и Safari терпят неудачу во всем.
Мне кажется, что без метода для этого мы не используем возможность получения данных параллельно, и нет причин, по которым мы не должны (как показывает Firefox).
Я поднял это как ошибку в вопросах хромированного регистр - http://code.google.com/p/chromium/issues/detail? id = 46109 – hawkett