2015-05-04 3 views
1

Когда выполнение Javascript в браузере прекращается после перехода на новую страницу html? Будет ли линия послеКогда выполнение Javascript прекращается?

window.location = "index.html"; 

все еще выполняется? Возвращается ли функция, содержащая эту строку? Когда выполняется XMLHttpRequest, будет ли вызываться обратный вызов onreadystatechange после того, как страница с кодом обратного вызова оставлена? Или обратный вызов вызова setTimeout? Это хорошо определено?

+1

Почему бы вам не попробовать сами и посмотреть .. – Zee

+0

@ Sourabh- Потому что он не просит * осуществления * поведения, но * теоретического * поведения/определенности. – Siguza

+0

Мне нужно что-то, на что я могу положиться (разные браузеры или версии), я проверял документацию, но не нашел ответа. – Gerhard

ответ

2

Когда вы переходите на новую страницу, существующая страница полностью отключается. Контекст Javascript останавливается и отбрасывается. Независимо от того, произойдет ли это закрытие сразу после нескольких строк кода после того, как куча строк кода полностью изменена. Вероятно, это связано с некоторыми асинхронными моментами, когда начинается загрузка новой страницы.

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

Быстрый тест в Chrome показывает, что alert() на самой следующей строке выполняет и ждет ввода пользователя, прежде чем он закончит загрузку следующего места, но это недокументированное поведение и небезопасно рассчитывать.

В Firefox предупреждение кратковременно мигает на экране, но не дожидается ввода пользователя и загружается новая страница.


Умный способ код не размещать любой код после установки window.location. Таким образом, вы не будете полагаться на поведение, которое зависит от браузеров, и все браузеры будут вести себя одинаково с вашим кодом. Если вы хотите выполнить что-то еще, сделайте это до того, как вы измените window.location. Или, если вы хотите, чтобы ваш текущий блок кода, чтобы закончить выполнение, а затем изменить местоположение в setTimeout() как в:

setTimeout(function() { 
    window.location = "http://www.stackoverflow.com"; 
}, 1); 

Это позволило бы надежно пусть текущий поток финишного выполнения, прежде чем страница была изменена на новый потому что setTimeout() работает через очередь событий, и это событие не будет обработано до тех пор, пока не будет выполнен текущий поток выполнения (независимо от того, сколько времени потребуется для завершения).

+1

Я бы не стал полагаться на таймаут, если после этого существует длинный код. Этот следующий код, я думаю, также может быть прерван функцией тайм-аута. – Gerhard

+1

@Gerhard - Javascript в браузере однопоточный (кроме webWorkers, которые не участвуют в этом обсуждении). Таймер НИКОГДА не прерывает выполняемый поток выполнения в Javascript. Когда пришло время запуска таймера, событие добавляется в очередь событий Javascript, и это событие затем обрабатывается ТОЛЬКО, когда выполняется текущий поток выполнения, и следующее событие вылетает из очереди.См. [Этот пост] (http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649) для получения дополнительных справочных материалов по этому вопросу. – jfriend00

+0

@Gerhard - так что 'setTimeout()' всегда будет возникать ПОСЛЕ того, как текущий поток выполнения выполняется, когда обрабатывается следующее событие в очереди событий. Это фундаментальный аспект того, как проектирование и построение управления событиями Javascript. Это зависит от количества кода. – jfriend00

Смежные вопросы