2015-09-15 2 views
2

Say пользователь закрывает вкладку, соответствующую текущую страницу, в момент t1 , в котором сценарий был запущен:Что произойдет, если страница закрыта во время выполнения javascript?

<script> 

    foo(); 

    // t1 <---------- 

    bar(); 

</script> 

Будет ли остальная часть <script> перспективы? Или вы сразу же убили Javascript?

Я могу представить, как данный второй <script> ниже описанного, этот второй скрипт никогда не будет запущен. Но, возможно, первый из них рассматривается как единая, безответственная вещь?

ответ

3

Это возможно это может отличаться от браузера, но, вероятно, нет. Консенсус (см. Ниже), по-видимому, заключается в том, что сценарий, кажется, завершается или, по крайней мере, дает несколько секунд для завершения; как только он (или через некоторый период времени, в любом случае), браузер закрывает вкладку.

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

Например, рассмотрим эту страницу:

<!doctype html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>Example</title> 
<style> 
html, body { 
    margin: 0; 
    padding: 0; 
} 
</style> 
<body> 
<p>I'm here</p> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
<script> 
var d = Date.now() + 10000; 
while (Date.now() < d) { 
} 
</script> 
</body> 
</html> 
  • Chrome: Показывает «Я здесь», и при нажатии на кнопку закрытия вкладки, он не закрывается в течение нескольких секунд (похоже, цикл завершает). (Если он не закончил, шансы Chrome в конечном итоге сказать вам сценарий был плохо себя.)

  • Firefox: Не показывать «Я здесь», но интерфейс делает то же самое: Не близко вкладку в течение нескольких секунд после запроса закрытия табуляции.

  • IE11: Может или не показывать «Я здесь», нажатие кнопки «закрыть вкладку» кажется более быстрым (но все же через несколько секунд), чем Chrome.

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

+0

Не могли бы вы поставить предупреждение перед закрытием '' и обновить результаты, если они будут показаны до закрытия вкладки? – mudasobwa

+0

Я думаю, что причиной такого поведения является вся вкладка, например, выполнение Javascript, однопоточность. Событие «закрыть вкладку» не завершено до тех пор, пока выполнение js не будет завершено. –

+2

@mudasobwa: 'alert' делает белки в браузерах, а белки меняются от браузера к браузеру. Я бы не удивился, например, если цикл завершен, мы вызываем «alert», браузер приостанавливает поток JavaScript (потому что «alert» является странным и блокирующим), а затем обрабатывает событие close - на некоторых браузерами, делая что-то другое на других. В частности, при закрытии окон помните, что сайты с нечеткими сайтами используются для использования «предупреждения» и т. Д., Чтобы захватить ваш браузер и не дать вам уйти, поэтому браузеры активны вокруг него. –

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