web-dev-qa-db-fra.com

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 car la fonction d'actualisation souhaite renvoyer les données de formulaire POST précédentes. Comment puis-je actualiser 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!

61
Ricibald

Changer simplement window.location en JavaScript est dangerous car l'utilisateur peut toujours appuyer sur le bouton back et soumettre à nouveau le message, ce qui pourrait avoir des résultats inattendus (comme un achat duplicata). PRG est une bien meilleure solution

Utilisez 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) associé à "Emplacement" HTTP. en-tête de réponse), demandant au navigateur de charger une page différente en utilisant une requête HTTP GET. La page de résultat peut ensuite être marquée ou rechargée en toute sécurité sans effets secondaires inattendus.

59
Sam Hasler

Vous ne pouvez pas actualiser sans avertissement. Actualiser indique au navigateur de répéter la dernière action. Il appartient au navigateur de choisir si l'utilisateur doit être averti si la dernière action implique de soumettre à nouveau les données.

Vous pouvez revenir à la même page avec une nouvelle session en procédant comme suit:

window.location = window.location.href;
106
Rex M

J'ai eu quelques problèmes avec anchor/hash-urls (y compris #) qui ne rechargent pas avec la solution de Rex ... 

J'ai donc finalement fini par enlever la partie hash: 

window.location = window.location.href.split("#")[0];
17
Rob

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;
11
Nikl

que diriez-vous window.location.replace (window.location.href);

5
david

Vous pouvez utiliser JavaScript:

window.location.assign(document.URL);

Travaillé pour moi sur Firefox et Chrome

vérifiez ce lien: http://www.codeproject.com/Tips/433399/PRG-Pattern-Post-Redirect-Get

3
Dan

Cela a fonctionné

<button onclick="window.location.href=window.location.href; return false;">Continue</button>

La raison pour laquelle cela n'a pas fonctionné sans le 

retourne faux;
est-ce que précédemment il traitait cela comme un bouton de soumission de formulaire. Avec un retour explicite false, le formulaire n'est pas soumis, il est simplement rechargé de la même page à la suite d'un précédent POST sur cette page.

2
Prasanna

Si vous en êtes au stade où vous avez terminé avec les données de publication et souhaitez simplement afficher à nouveau la page, vous pouvez simplement utiliser un window.location et même peut-être ajouter une chaîne aléatoire en tant que paramètre de requête afin de garantir une nouvelle version du paramètre. page. 

2
AJM

La version de Nikl ne passe pas les paramètres de requête get, j'ai utilisé la version modifiée suivante: 

window.location.href = window.location.protocol +'//'+ window.location.Host + window.location.pathname + window.location.search;

ou dans mon cas, j'avais besoin d'actualiser la page\frame la plus haute, alors j'ai utilisé la version suivante

window.top.location.href = window.top.location.protocol +'//'+ window.top.location.Host + window.top.location.pathname + window.top.location.search;
2
Patlatus
<html:form name="Form" type="abc" action="abc.do" method="get" onsubmit="return false;">

method="get" - résout le problème.

if method="post" alors seulement l'avertissement vient.

1
ABC

J'ai écrit une fonction qui rechargera la page sans post-soumission et qui fonctionnera également avec des hachages. 

Je le fais en ajoutant/modifiant un paramètre GET dans l'URL appelée reload en mettant à jour sa valeur avec l'horodatage actuel en ms. 

var reload = function () {
    var regex = new RegExp("([?;&])reload[^&;]*[;&]?");
    var query = window.location.href.split('#')[0].replace(regex, "$1").replace(/&$/, '');
    window.location.href =
        (window.location.href.indexOf('?') < 0 ? "?" : query + (query.slice(-1) != "?" ? "&" : ""))
        + "reload=" + new Date().getTime() + window.location.hash;
};

N'oubliez pas que si vous souhaitez déclencher cette fonction dans un attribut href, implémentez-la de la manière suivante: href="javascript:reload();void 0;" pour que cela fonctionne correctement.

L'inconvénient de ma solution est que cela va changer l'URL, donc ce "rechargement" n'est pas un vrai rechargement, mais plutôt une charge avec une requête différente. Néanmoins, cela pourrait répondre à vos besoins, comme cela me convient.

0
modiX

vous n'êtes pas obligé d'utiliser le javascript pour tout faire. De nombreux problèmes ont des solutions faciles comme celle-ci. vous pouvez utiliser cette ancre délicate:

<a href=".">Continue</a>

bien sûr, je sais que vous aurez peut-être besoin d'une solution automatique, mais cela aidera dans de nombreux cas.

bonne chance

0
Mahyar Damavand