Firefox не выполняет один динамически загруженный элемент <script>, пока другой не будет загружен - PullRequest
1 голос
/ 26 ноября 2009

Я реализую Comet, используя метод длинных опросов тега script, основанный на этой странице . Исходя из моего предыдущего вопроса , у меня все работает, кроме одного раздражения, которое происходит только в Firefox.

При начальной загрузке страницы мой клиент Comet JavaScript отправляет два запроса на сервер Comet (в виде динамически генерируемых тегов <script>, которые добавляются в DOM):

  1. get_messages - это текущий опрос сообщений из приложения.
  2. initialise - это однократный запрос при запуске.

Эти два происходят одновременно - т. Е. Теги <script> для них обоих существуют в DOM одновременно. (Я вижу их в инспекторе Firebug DOM.) Сервер немедленно отправляет некоторый сценарий в ответ на запрос initialise, но ничего не отправляет для запроса get_messages, пока на самом деле не появится сообщение, которое может занять некоторое время.

В Firefox 3.5 сценарий, возвращенный в теге <script> для запроса initialise, не выполняется, пока другой тег <script> (для get_messages) также не загрузится! В Chrome 3 и IE 8 это работает нормально - скрипт выполняется сразу после его получения.

Почему Firefox делает это и как мне это исправить? Я полагаю, я мог бы попытаться обойти это на сервере, отправив фиктивное «сообщение» в то же время, что и ответ initialise, но это довольно взломано. Я хотел бы понять и исправить это должным образом, если это возможно.

Ответы [ 2 ]

3 голосов
/ 27 ноября 2009

Мне кажется, это вопрос порядка загрузки. Firefox всегда гарантирует, что запросы в очереди выполняются в том порядке, в котором они были запрошены. IE НЕ обеспечивает это (не уверен насчет Chrome).

В любом случае, если вы не должны вызывать get_messages до тех пор, пока не будет инициализирован код, вы все равно захотите инициировать этот запрос в обратном вызове из вашей функции инициализации. Вы бы хотели сделать это несмотря ни на что, потому что другие браузеры также могут быть несовместимыми. IE6, безусловно, не работает так же, как другие браузеры, в отношении порядка загрузки - он не продолжит загрузку DOM, пока не завершится запрос на длинный опрос, так что вы застряли в ожидании своего длинного интервала опроса, чтобы увидеть главная нагрузка DOM.

Вы можете проверить исходный код нашего клиента javascript, если вам нужны подробности, мы столкнулись с похожими проблемами при создании нашего комет-сервера ASP.NET, WebSync. Источник можно посмотреть здесь:

http://sync.frozenmountain.com/client.ashx?debug=true

Выполните поиск "ie6", чтобы увидеть некоторые обходные пути.

0 голосов
/ 26 ноября 2009

Я не уверен, почему это происходит, но, возможно, простой обходной путь - добавить тег get_messages <script> только после завершения запроса инициализации. (Я предполагаю, что у вас есть какой-то обратный вызов, который обрабатывает ответ от запроса инициализации.)

...