77 votes

Comment recharger une page sans avertissement POSTDATA en Javascript ?

Je veux recharger une page en utilisant :

window.location.reload(true); 

Mais je reçois l'avertissement POSTDATA parce que la fonction de rafraîchissement veut renvoyer les données du formulaire POST précédent. Comment puis-je rafraîchir ma page sans cet avertissement ?

MISE À JOUR : Je n'ai aucun contrôle sur le projet ! Je ne peux pas contourner le POST lui-même !

0 votes

Soumettre à nouveau un POST (ce que fait un rechargement) fera toujours apparaître cet avertissement. Vous pouvez effectuer un autre POST au lieu de recharger, mais cela remplira l'historique du navigateur de l'utilisateur si vous le faites trop souvent, et il recevra toujours l'avertissement s'il appuie sur le bouton "retour".

1 votes

145voto

Rex M Points 80372

Vous ne pouvez pas actualiser le site sans l'avertissement ; l'actualisation demande au navigateur de répéter la dernière action. C'est au navigateur de choisir s'il doit avertir l'utilisateur si la répétition de la dernière action implique de soumettre à nouveau des données.

Vous pouvez naviguer à nouveau sur la même page avec une nouvelle session en faisant :

window.location = window.location.href;

0 votes

L'utilisateur peut toujours cliquer sur le bouton "retour" et soumettre à nouveau le message, ce qui peut avoir des résultats inattendus (comme un achat en double). Le PRG est une bien meilleure solution.

0 votes

Peut-être, mais si l'utilisateur clique en arrière pour une raison quelconque, il recevra quand même un avertissement, donc peut-être que l'utilisation de PRG dépend des conséquences de la resoumission.

0 votes

Il est vrai que si le serveur reconnaît les messages en double, ce n'est pas un problème, mais l'utilisateur est toujours confronté à une boîte de dialogue dont il doit se préoccuper. Avec PRG, l'utilisateur ne verra jamais ce dialogue.

72voto

Sam Hasler Points 10253

Je change juste window.location en JavaScript est dangereux parce que l'utilisateur pourrait toujours toucher le bouton retour et soumettre à nouveau le message, ce qui pourrait avoir des résultats inattendus (comme une double achat ). Le PRG est une bien meilleure solution

Utiliser le modèle Post/Redirect/Get (PRG)

Pour éviter ce problème, de nombreuses applications Web utilisent le modèle PRG : au lieu de renvoyer directement une page HTML, l'opération POST renvoie une commande de redirection (à l'aide du code de réponse HTTP 303 (parfois 302) et de l'en-tête de réponse HTTP "Location"), qui demande au navigateur de charger une autre page à l'aide d'une requête HTTP GET. La page résultante peut alors être mise en signet ou rechargée en toute sécurité sans effets secondaires inattendus.

Côté client

Si vous voulez le faire entièrement côté client, vous devrez modifier l'historique du navigateur avant de procéder à l'actualisation :

if ( window.history.replaceState ) {
    window.history.replaceState( null, null, window.location.href );
}
window.location = window.location.href;

0 votes

Je n'ai aucun contrôle sur le projet. Je ne peux pas contourner le POST lui-même !

0 votes

Le PRG est effectué après le POST, en redirigeant silencieusement le client vers une page GET afin qu'il n'ait pas le POST dans son historique. (Cela vaut la peine d'en parler à la personne qui a le contrôle). Si vous ne pouvez pas le faire, pouvez-vous naviguer vers une page GET au lieu de recharger le POST ?

4 votes

Oui, mais la redirection d'un POST nécessite une forme de contrôle.

13voto

Nikolay Lisienko Points 196

Pour contourner l’avertissement POST, vous devez recharger la page avec une URL complète. Fonctionne bien.

 window.location.href = window.location.protocol +'//'+ window.location.host + window.location.pathname;
 

0 votes

Cela ne fonctionne pas. Bien qu'elle contourne l'avertissement POST, elle contourne également l'envoi de toute variable post qui pourrait être nécessaire.

0 votes

Ajoutez alors window.location.hash à la fin.

0 votes

Pour une URL complète avec le protocole (si ce n'est pas 80) et les paramètres, voir bl.ocks.org/abernier/3070589 .

5voto

david Points 31

Pourquoi pas window.location.replace(window.location.href) ;

2voto

AJM Points 8735

Si vous en avez terminé avec les données de l'article et que vous souhaitez simplement afficher la page à nouveau, vous pouvez simplement utiliser window.location et même ajouter une chaîne aléatoire comme paramètre de requête pour garantir une nouvelle version de la page.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X