JavaScript onunload вызывается только если документ полностью загружен? - PullRequest
1 голос
/ 03 февраля 2010

Я не встречал упоминаний об этой книге Дэвида Фланагана «JavaScript - полное руководство» (я тоже задавал этот вопрос на O'Reilly Ответы) или где-либо еще по этому вопросу, но я обнаружил, что window.onunload не вызывается, если документ не загружен полностью, что довольно раздражает! Это верно для IE8 и Chrome 3 по крайней мере

У меня есть фрагмент Javascript, который я хочу добавить в конец веб-страниц. Если пользователь случайно щелкнул страницу до загрузки страницы (^ см. Ниже) и до того, как мой Javascript успел запуститься, я надеялся перехватить это в onunload. Но это невозможно, так как обработчик события onunload вызывается только при полной загрузке документа. Если я не могу использовать onunload, могу ли я использовать что-то еще для достижения того же самого?

^ «Javascript - The Definitive Guide» предполагает, что взаимодействие пользователя со страницей не может происходить, пока страница не загружена. Я считаю, что это неправильно. Вот что говорится в книге:

"Еще одна серая область в модели выполнения Javascript - это вопрос о том, можно ли вызывать обработчики событий до полной загрузки документа. Наше обсуждение модели выполнения Javascript до сих пор пришло к выводу, что все обработчики событий всегда запускаются после того, как все сценарии были выполнены. Хотя это обычно происходит, это не требуется никаким стандартом. Если документ очень длинный или загружается по медленному сетевому соединению, браузер может частично отобразить документ и позволить пользователю начать взаимодействие с ним (и запускает обработчики событий) до запуска всех сценариев и обработчиков загрузки. Если такой обработчик событий вызывает функцию, которая еще не определена, он завершится ошибкой (это одна из причин для определения всех функций в сценариях в document.) И если такой обработчик событий попытается манипулировать частью документа, которая еще не была проанализирована, он потерпит неудачу. Этот сценарий редко встречается на практике и обычно не стоит дополнительного кодирования ef Форт обязан агрессивно защищаться от этого. " (5-е издание, стр. 256)

Я выполнил тесты на IE8, которые показали, что на любой стадии загрузки страницы можно взаимодействовать со страницей (и оставлять ее через ссылку).

Спасибо за любую помощь, Пол

1 Ответ

0 голосов
/ 03 февраля 2010

Для меня имеет смысл, что событие onunload не может быть запущено, пока документ не проанализирован. Синтаксический анализ документа и выполнение сценария обычно выполняются в одном потоке, и если пользователь должен был перейти со страницы, то поток будет отменен после возникновения события onunload. Поскольку синтаксический анализ использует поток во время перехода пользователя от страницы, браузер будет иметь следующие параметры:

  • Завершите анализ и запустите событие unload, что приведет к задержке перехода на следующую страницу, так что это нереально.
  • Отмена анализа и запуск события выгрузки - это более выполнимый вариант, но вы, вероятно, можете увидеть, что некоторые UA не беспокоятся.
  • Просто остановите поток и перейдите на следующую страницу - похоже, именно это происходит в IE и Chrome

Может быть, вы могли видеть, было ли запущено событие onbeforeunload ? Я не думаю, что это будет иметь значение, хотя. Я думаю, что лучше всего было бы посмотреть, как можно оптимизировать страницу, чтобы она быстрее загружалась.

...