2016-04-04 4 views
6

Следующий код изменяет местоположение на www.bing.com, независимо от того, что перенаправление перенаправлено 1 или любое другое число. Если перенаправление равно 1, он регистрирует «перенаправление», а затем перенаправляется на сайт www.bing.com. Мое лучшее предположение заключается в том, что когда href установлен, происходит событие change-event, но перед выполнением выполняется несколько тиков. Meanwilethe первая строка кода после этого выполняется. Или? делать что-нибудь, что происходит?Почему установка window.location.href не останавливает выполнение сценария

if (redirect == 1) { 
    console.log("is redirecting"); 
    window.location.href = "http://www.google.com"; 
} 

window.location.href = "http://www.bing.com"; 
+1

использовать блок 'else' – DanFromGermany

+0

Интересно! MDN [говорит] (https://developer.mozilla.org/en-US/docs/Web/API/Window/location), что «когда новому объекту присваивается новое значение, документ будет загружен с использованием URL-адреса как будто location.assign() был вызван ". Вы получаете то же поведение с .assign()? –

+1

@DanFromGermany - я действительно решил его с другом, но он меня нечетко, я не знаю, почему он продолжает – Bildsoe

ответ

2

Я бы сказал, что поведение не определено.

Когда вы установите ожидаемый url на window.location.href, текущая страница будет фактически находиться в состоянии dying. И результат написанного после этого кода просто непредсказуем.

+0

Но почему бы не прекратить выполнение кода во время умирающего состояния? – Bildsoe

+0

@Bildsoe Потому что в некоторых случаях вы можете отправить некоторые данные на сервер, когда страница будет * умирающей *. – Lewis

+0

@Bildsoe, потому что вы можете захотеть, чтобы события по-прежнему вызывались, прежде чем менять местоположение. – DanFromGermany

0

Это потому, что все после if выполняется так же, но, похоже, что есть разница между Chrome и FF (не проверял в IE).

Пример кода:

var redirect = 1; 

if (redirect == 1) { 
    console.log("is redirecting"); 
    document.location.assign('https://developer.mozilla.org/'); 
} 

alert('go'); 
document.location.assign('https://www.bing.com/'); 

В Chrome 'идти' предупреждается, и вы будете перенаправлены на bing.com. В Firefox «go» предупреждается, но вы перенаправлены в MDN.

Я думаю, лучшее, что нужно сделать, это обернуть другой материал в else.

+1

Да, но на самом деле вопрос в том, почему он продолжает выполнение скриптов - почему бы не просто остановить выполнение скрипта и перенаправить «мгновенный»? – Bildsoe

1

Вы устанавливаете свойство, а не вызов метода, разница важна:

window.location.href = "something"; 

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

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

Когда вы сравниваете это с заголовком местоположения HTTP, поведение такое же. Иногда вы, например, хотите, чтобы PHP-скрипты продолжались, даже вы отправляете заголовок изменения местоположения.

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