2010-03-29 3 views
31

Lorsque vous écrivez du code côté serveur, vous devez explicitement arrêter l'exécution après avoir envoyé un en-tête "Location: ..." au client, sinon votre code continuera à s'exécuter en arrière-plan.Le changement de window.location arrête-t-il l'exécution de javascript?

Mais qu'en est-il lorsque vous modifiez window.location dans un script côté client? Est-ce que cela arrête immédiatement l'exécution du script en cours ou est-ce au programmeur de s'assurer que tout code situé après cet appel n'est pas atteint?

+0

+1 pour une question intéressante –

+0

@DavidAndersson Quoi d'autre que votre +1 impliquerait? – stolsvik

+0

@stolsvik presque tout, y compris est utile, montre l'effort de recherche, et est clair. Peut-être que ça vaut aussi la peine de lire, drôle, intrigant, etc? – Andrew

Répondre

11

La définition window.location n'interrompt pas implicitement l'exécution de JS. Prenez l'exemple suivant:

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

locationTest(); 

Essayez d'exécuter cela à partir de Firebug/Web Inspector/etc. et vous remarquerez que la fenêtre actuelle va charger Google, mais une nouvelle fenêtre s'ouvrira également avec Yahoo.

+0

Cela pourrait être une condition de concurrence. Je peux imaginer que les anciens scripts cessent d'être exécutés lorsque le nouvel emplacement a terminé le chargement. – codymanix

+0

Sur Safari, il semble qu'il arrête l'exécution après window.location –

15

Est-ce que cet arrêt immédiatement l'exécution du script en cours

Non, le script de gestionnaire restant exécutera à la fin avant le retour de commande au navigateur et les événements commencent à se produire. Lorsque le chargement de la nouvelle page est suffisamment long pour que la 'navigation' se produise, les événements beforeunload et unload se déclenchent, puis la page et tout script qui s'y trouve devient inactif. Toutefois, tous les événements et les délais d'attente ultérieurs risquent de ne pas se déclencher. Par exemple si vous parcourez la page dans un gestionnaire click d'un bouton d'envoi de formulaire et n'annulez pas l'action par défaut, il est possible que la navigation se produise avant l'événement submit mis en file d'attente par l'action par défaut du click.

+4

Merci. En corollaire à cette question, y a-t-il un moyen de détecter quand vous êtes dans cet état (par exemple, 'window.location' a changé mais la navigation n'a pas encore eu lieu)? – speedplane

+0

Merci, juste la réponse dont j'avais besoin. Votre réponse est-elle basée sur l'observation du fonctionnement des navigateurs ou ce comportement est-il défini quelque part? –

+0

La réponse était basée sur l'observation, mais un certain travail a été fait en HTML5 sur la normalisation du flux de contrôle du navigateur, par exemple https://www.w3.org/TR/html5/webappapis.html#event-loops, https: // www.w3.org/TR/html5/browsers.html#navigate. Les standards auxquels nous nous sommes retrouvés sont en grande partie illisibles, et laissent toujours un tas de choses non spécifiées, mais nous sommes toujours dans une meilleure situation que l'inconsistant et mystérieux que nous avions auparavant. – bobince

Questions connexes