web-dev-qa-db-de.com

Wie lade ich eine Seite ohne eine POSTDATA-Warnung in Javascript?

Ich möchte eine Seite neu laden mit:

window.location.reload(true); 

Ich erhalte jedoch die POSTDATA-Warnung, weil die Aktualisierungsfunktion die vorherigen POST -Formulardaten erneut senden möchte. Wie kann ich meine Seite ohne diese Warnung aktualisieren?

AKTUALISIERT: Ich habe keine Kontrolle über das Projekt! Ich kann den POST selbst nicht umgehen!

61
Ricibald

Das Ändern von window.location in JavaScript ist dangerous, da der Benutzer noch auf die Schaltfläche back klicken und den Beitrag erneut senden kann, was zu unerwarteten Ergebnissen führen kann (z. B. Duplicate Purchase). PRG ist eine viel bessere Lösung

Verwenden Sie das Post/Redirect/Get (PRG) -Muster

Um dieses Problem zu vermeiden, verwenden viele Webanwendungen das PRG-Muster. Statt eine HTML-Seite direkt zurückzugeben, gibt die Operation POST einen Umleitungsbefehl zurück. Response Header), der den Browser anweist, eine andere Seite mit einer HTTP GET-Anfrage zu laden. Die Ergebnisseite kann dann ohne unerwartete Nebeneffekte sicher mit einem Lesezeichen versehen oder erneut geladen werden.

59
Sam Hasler

Sie können nicht ohne Warnung aktualisieren. Aktualisieren weist den Browser an, die letzte Aktion zu wiederholen. Der Browser kann entscheiden, ob der Benutzer gewarnt werden soll, wenn die letzte Aktion wiederholt wird, um Daten erneut zu senden.

Sie können zu derselben Seite mit einer neuen Sitzung wechseln, indem Sie Folgendes tun:

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

Ich hatte einige Probleme mit dem Anchor/Hash-URL (einschließlich #), der nicht mit der Lösung von Rex geladen wurde ... 

So endete ich schließlich mit dem Entfernen des Hash-Teils: 

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

Um die Warnung POST zu umgehen, müssen Sie die Seite mit vollständiger URL neu laden. Funktioniert gut.

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

wie wäre es mit window.location.replace (window.location.href);

5
david

Sie können JavaScript verwenden:

window.location.assign(document.URL);

Arbeitete für mich an Firefox und Chrome

Überprüfen Sie diesen Link: http://www.codeproject.com/Tips/433399/PRG-Pattern-Post-Redirect-Get

3
Dan

Das hat funktioniert

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

Der Grund, warum es ohne das nicht funktioniert hat 

falsch zurückgeben;
ist, dass es zuvor als Schaltfläche zum Senden von Formularen behandelt wurde. Mit der expliziten Rückgabe false wird das Formular nicht gesendet, sondern nur die Seite, die das Ergebnis eines vorherigen POST dieser Seite war, wird erneut geladen.

2
Prasanna

Wenn Sie sich in einem Stadium befinden, in dem Sie mit den Post-Daten fertig sind und die Seite einfach erneut anzeigen möchten, können Sie einfach eine window.location verwenden und möglicherweise sogar eine zufällige Zeichenfolge als Abfrageparameter anhängen, um eine neue Version von Seite. 

2
AJM

Nikls Version gibt keine Abfrageparameter weiter, ich habe die folgende modifizierte Version verwendet: 

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

oder in meinem Fall musste ich die oberste Seite\Frame erneuern, daher habe ich die folgende Version verwendet

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" - behebt das Problem.

if method="post" dann kommt nur eine Warnung.

1
ABC

Ich habe eine Funktion geschrieben, die die Seite ohne Einreichung des Postens neu lädt und auch mit Hashes funktioniert. 

Dazu füge ich einen GET-Parameter in der URL mit dem Namen reload hinzu, indem ich seinen Wert mit dem aktuellen Zeitstempel in ms aktualisiere. 

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;
};

Denken Sie daran, wenn Sie diese Funktion in einem href-Attribut auslösen möchten, implementieren Sie sie folgendermaßen: href="javascript:reload();void 0;", damit sie erfolgreich funktioniert.

Der Nachteil meiner Lösung besteht darin, dass die URL geändert wird. Daher ist dieses "Neuladen" kein wirkliches Neuladen, sondern ein Laden mit einer anderen Abfrage. Trotzdem könnte es Ihren Bedürfnissen entsprechen, wie es für mich der Fall ist.

0
modiX

sie sind nicht gezwungen, Javascript zu verwenden, um alles zu tun. Viele Probleme haben einfache Lösungen wie diese. Sie können diesen kniffligen Anker verwenden:

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

natürlich weiß ich, dass Sie möglicherweise eine automatische Lösung benötigen, aber dies wird in vielen Fällen helfen.

viel Glück

0
Mahyar Damavand