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

68

Ich möchte eine Seite neu laden mit:

window.location.reload(true); 

Ich erhalte jedoch die POSTDATA-Warnung, da die Aktualisierungsfunktion frühere 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!

Ricibald
quelle
Wenn Sie einen POST erneut senden (was beim erneuten Laden der Fall ist), wird diese Warnung immer angezeigt. Sie könnten einen anderen POST durchführen, anstatt ihn neu zu laden, obwohl dies den Browserverlauf des Benutzers füllen würde, wenn Sie dies zu oft tun, und er würde immer noch die Warnung erhalten, wenn er auf die Schaltfläche "Zurück" klickt.
Sam Hasler

Antworten:

65

Nur das Ändern window.locationvon JavaScript ist gefährlich, da der Benutzer immer noch auf die Schaltfläche "Zurück" klicken und den Beitrag erneut senden kann, was zu unerwarteten Ergebnissen führen kann (z. B. ein doppelter Kauf ). PRG ist eine viel bessere Lösung

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

Um dieses Problem zu vermeiden, verwenden viele Webanwendungen das PRG-Muster. Anstatt eine HTML-Seite direkt zurückzugeben, gibt die POST-Operation einen Umleitungsbefehl zurück (unter Verwendung des HTTP 303-Antwortcodes (manchmal 302) zusammen mit dem HTTP-Antwortheader "Standort"). Anweisen des Browsers, eine andere Seite mithilfe einer HTTP-GET-Anforderung zu laden. Die Ergebnisseite kann dann ohne unerwartete Nebenwirkungen sicher mit einem Lesezeichen versehen oder neu geladen werden.

Sam Hasler
quelle
Ich habe keine Kontrolle über das Projekt. Ich kann den POST selbst nicht umgehen!
Ricibald
PRG wird nach dem POST durchgeführt und leitet den Client stillschweigend auf eine GET-Seite um, damit er den POST nicht in seinem Verlauf hat. (Es lohnt sich, mit demjenigen zu sprechen, der die Kontrolle hat.) Wenn Sie dies nicht können, können Sie dann zu einer GET-Seite navigieren, anstatt den POST neu zu laden?
Sam Hasler
3
Ja, aber das Umleiten eines POST erfordert irgendeine Form der Kontrolle
Ricibald
Wie können wir PRG verwenden? Ich habe immer noch keine Idee. Wenn ich eine Seite neu lade, werde ich immer gefragt, ob ich PRG neu laden möchte. Wie kann ich PRG hier anwenden? Bitte geben Sie einen Beispielcode an
Gina Gina
128

Sie können ohne die Warnung nicht aktualisieren. Aktualisieren weist den Browser an, die letzte Aktion zu wiederholen. Es ist Sache des Browsers, zu entscheiden, ob der Benutzer gewarnt werden soll, wenn das Wiederholen der letzten Aktion das erneute Senden von Daten umfasst.

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

window.location = window.location.href;
Rex M.
quelle
Der Benutzer kann weiterhin auf die Schaltfläche "Zurück" klicken und den Beitrag erneut senden, was zu unerwarteten Ergebnissen führen kann (z. B. ein doppelter Kauf). PRG ist eine viel bessere Lösung.
Sam Hasler
Möglicherweise, aber wenn der Benutzer aus irgendeinem Grund zurückklickt, wird immer noch eine Warnung angezeigt. Daher hängt die Verwendung von PRG möglicherweise von den Konsequenzen einer erneuten Einreichung ab.
AJM
true, wenn der Server doppelte Beiträge erkennt, ist dies kein Problem, aber dem Benutzer wird weiterhin ein Dialogfeld angezeigt, über das er sich Sorgen machen muss. Mit PRG wird der Benutzer diesen Dialog nie sehen.
Sam Hasler
3
@sam Sie haben den Rahmen der Frage verlassen. Wir wissen nichts darüber, wie oder warum sich der Fragesteller in der Situation befindet, in der er sich befindet.
Rex M
1
Beachten Sie, dass dies nicht funktioniert (zumindest in Firefox), wenn die URL ein # enthält.
Leven
21

Ich hatte einige Probleme mit Anker- / Hash-URLs (einschließlich #), die nicht mit der Lösung von Rex neu geladen wurden ...

Also habe ich endlich den Hash-Teil entfernt:

window.location = window.location.href.split("#")[0];
rauben
quelle
12

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

window.location.href = window.location.protocol +'//'+ window.location.host + window.location.pathname;
Nikl
quelle
Das funktioniert nicht. Obwohl die POST-Warnung umgangen wird, wird auch das Senden von Post-Variablen umgangen, die möglicherweise erforderlich sind.
Iankit
Fügen Sie dann window.location.hash am Ende hinzu.
Ian Stanway
Eine vollständige URL mit Protokoll (wenn nicht 80) und Parametern finden Sie unter bl.ocks.org/abernier/3070589 .
Ian Stanway
Diese Version besteht keine Get-Abfrageparameter. Ich habe die folgende geänderte Version verwendet: window.location.href = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location. Suche;
Patlatus
5

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

David
quelle
3

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 Formular-Senden-Schaltfläche behandelt wurde. Mit einer expliziten Rückgabe false wird das Formular nicht gesendet und nur die gleiche Seite neu geladen, die das Ergebnis eines vorherigen POST auf dieser Seite war.

Prasanna
quelle
2

Wenn Sie sich in der Phase befinden, in der 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 der zu garantieren Seite.

AJM
quelle
2

Nikls Version besteht keine Abfrageparameter, 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 aktualisieren, also 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;
Patlatus
quelle
1
<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.

ABC
quelle
0

Ich habe eine Funktion geschrieben, die die Seite ohne Post-Submission neu lädt und auch mit Hashes funktioniert.

Dazu füge ich einen GET-Parameter in der aufgerufenen URL hinzu / ändere ihn, indem ich reloadseinen 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: Damit href="javascript:reload();void 0;"sie erfolgreich funktioniert.

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

Martin Braun
quelle
0

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 hilfreich sein.

Viel Glück

Mahyard
quelle
-1

Verwenden von Meta Refresh in HTML

<meta http-equiv='refresh' content='1'>

mit meta refresh in php

echo "<meta http-equiv='refresh' content='1'>"
rafif
quelle
-1

Hier ist eine Lösung, die immer funktionieren sollte und den Hash nicht entfernt.

let currentPage = new URL(window.location.href);
currentPage.searchParams.set('r', (+new Date * Math.random()).toString(36).substring(0, 5));
window.location.href = currentPage.href;
Bjørnar Hagen
quelle
-1

Die anderen Lösungen mit window.locationhaben bei mir nicht funktioniert, da sie überhaupt nicht aktualisiert wurden. Ich habe also ein leeres Formular verwendet, um neue und leere Postdaten an dieselbe Seite zu übergeben. Dies ist eine Möglichkeit, dies basierend auf dieser Antwort zu tun :

function refreshAndClearPost() {
    var form = document.createElement("form");
    form.method = "POST";
    form.action = location.href;
    form.style.display = "none";

    document.body.appendChild(form);
    form.submit();    //since the form is empty, it will pass empty postdata
    document.body.removeChild(form);
}
Donald Duck
quelle
-2

Wenn Sie GETstattdessen die Methode verwenden POST, können wir die Werte der Formulardatei nicht verwenden. Wenn Sie verwenden window.opener.location.href = window.opener.location.href;, können wir die JSPDatenbank auslösen und den Wert abrufen, aber das einzige ist, dass das nicht aktualisiert wird, obwohl das Scriplet die Formularwerte enthält.

Nick
quelle