2010-03-29 10 views
31

Al escribir el código del lado del servidor, debe detener la ejecución explícitamente después de enviar un encabezado "Ubicación: ..." al cliente o su código continuará ejecutándose en segundo plano.¿El cambio de window.location detiene la ejecución de javascript?

¿Pero qué pasa cuando se cambia window.location en un script del lado del cliente? ¿Esto detiene inmediatamente la ejecución del script actual o le corresponde al programador asegurarse de que no se llegue a ningún código ubicado después de esta llamada?

+0

+1 para la pregunta interesante –

+0

@DavidAndersson ¿Qué más implicaría su +1? – stolsvik

+0

@stolsvik casi cualquier cosa, incluso es útil, muestra el esfuerzo de investigación, y está claro. Tal vez también vale la pena leer, gracioso, intrigante, etc. – Andrew

Respuesta

11

La configuración window.location no implícitamente detiene la ejecución de JS. Tome lo siguiente como un ejemplo:

function locationTest() { 
    window.location = 'http://www.google.com/'; 
    window.open('http://www.yahoo.com/'); 
} 

locationTest(); 

Intente ejecutar eso desde Firebug/Web Inspector/etc. y notará que la ventana actual cargará Google, pero se abrirá una nueva ventana con Yahoo también.

+0

Esto podría ser una condición de carrera. Me imagino que las secuencias de comandos antiguas dejan de ejecutarse cuando la nueva ubicación ha terminado de cargar – codymanix

+0

En Safari parece que detiene la ejecución después de window.location –

15

¿Este detener inmediatamente la ejecución del script actual

No, el guión manejador restante se ejecutará hasta el final antes de que el control vuelve al navegador y eventos comienzan a suceder. Cuando la carga de la nueva página sea lo suficientemente grande como para que se produzca la "navegación", se activarán los eventos beforeunload y unload, y luego y la secuencia de comandos se inactiva.

Sin embargo, es posible que no se activen más eventos y tiempos de espera en cola. Por ejemplo, si navega por la página en un controlador click de un botón de envío de formulario y no cancela la acción predeterminada, es posible (condición de anticipación) que la navegación se produzca antes del evento submit en cola por la acción predeterminada click.

+4

Gracias. Como corolario de esta pregunta, ¿hay alguna manera de detectar cuándo se encuentra en este estado (es decir, 'window.location' ha cambiado pero aún no se ha navegado)? – speedplane

+0

Gracias, solo la respuesta que necesitaba. ¿Su respuesta se basa en observar cómo funcionan los navegadores o se define este comportamiento en alguna parte? –

+0

La respuesta se basó en la observación, pero se ha realizado algo de trabajo en HTML5 sobre la estandarización del flujo de control del navegador-asee, por ejemplo, https://www.w3.org/TR/html5/webappapis.html#event-loops, https: // www.w3.org/TR/html5/browsers.html#navigate. Los estándares con los que hemos terminado son en gran parte ilegibles, y todavía dejan un montón de cosas no especificadas, pero aún estamos en una situación mejor que la inconsistente y misteriosa que teníamos antes. – bobince

Cuestiones relacionadas