2009-02-20 12 views
54

Ich möchte eine Seite neu zu laden mit:Wie kann ich eine Seite ohne POSTDATA-Warnung in Javascript neu laden?

window.location.reload(true); 

Ich aber nehme die Postdata Warnung, weil die Refresh-Funktion vorherige POST Formulardaten erneut senden möchten. Wie kann ich meine Seite ohne diese Warnung aktualisieren?

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

+0

Das erneute Einreichen eines POST (was ein Reload bewirkt) wird immer diese Warnung auslösen. Sie könnten einen anderen POST statt neu laden, obwohl das den Browserverlauf des Benutzers füllen würde, wenn Sie es zu oft tun, und sie würden immer noch die Warnung erhalten, wenn sie die Zurück-Taste drücken. –

+1

Duplizieren: http://stackoverflow.com/questions/1073593/php-reload-page-without-posting-data/1073732#1073732 – Quentin

Antwort

55

Gerade window.location in JavaScript zu ändern ist gefährlich, da der Benutzer immer noch die Zurück-Taste schlagen konnte und die Post erneut übermittelt, die zu unerwarteten Ergebnisse ( wie ein doppelter Kauf) haben könnten. PRG ist eine viel bessere Lösung

Use the Post/Redirect/Get (PRG) pattern

Um dieses Problem zu vermeiden, verwenden viele Web-Anwendungen, die das Muster PRG - stattdessen eine HTML-Seite direkt zurückzukehren, kehrt die POST-Operation einen Umleitungsbefehl (unter Verwendung des HTTP-303 Response-Code (manchmal 302) zusammen mit dem Antwortkopf "Location" (HTTP), der den Browser anweist, eine andere Seite mit einer HTTP-GET-Anforderung zu laden. Die Ergebnisseite kann dann ohne unerwartete Nebenwirkungen mit einem Lesezeichen versehen oder neu geladen werden.

+0

Ich habe keine Kontrolle über das Projekt. Ich kann den POST selbst nicht umgehen! – Ricibald

+0

PRG wird nach dem POST ausgeführt und leitet den Client automatisch auf eine GET-Seite um, so dass sie den POST nicht in ihrem Verlauf haben. (Es lohnt sich, mit dem zu sprechen, der Kontrolle hat.) Wenn Sie das nicht können, können Sie dann zu einer GET-Seite navigieren, anstatt den POST neu zu laden? –

+3

Ja, aber das Umleiten eines POST erfordert eine Form der Kontrolle – Ricibald

101

Sie können ohne die Warnung nicht aktualisieren; Aktualisieren weist den Browser an, die letzte Aktion zu wiederholen. Es bleibt dem Browser überlassen, ob er den Benutzer warnen soll, wenn das Wiederholen der letzten Aktion die erneute Übermittlung von Daten erfordert.

Sie können, indem Sie mit einer frischen Sitzung auf die gleiche Seite erneut navigieren:

window.location = window.location.href; 
+0

Der Benutzer könnte immer noch die Zurück-Taste drücken und den Beitrag erneut einreichen, was zu unerwarteten Ergebnissen führen könnte (wie ein Duplikat Kauf). PRG ist eine viel bessere Lösung. –

+0

Vielleicht, aber wenn der Benutzer aus irgendeinem Grund zurückklickt, wird immer noch eine Warnung angezeigt, weshalb die Verwendung von PRG davon abhängt, welche Konsequenzen die Wiedervorlage hat. – AJM

+0

true, wenn der Server doppelte Posts erkennt, ist das kein Problem, aber dem Benutzer wird immer noch ein Dialogfeld angezeigt, über das er sich Gedanken machen muss. Mit PRG wird der Benutzer diesen Dialog nie sehen. –

2

Wenn Sie auf der Bühne sind, wo Sie mit den Post-Daten fertig sind und einfach die Seite erneut anzeigen möchten neu , könnten Sie einfach eine window.location verwenden und vielleicht sogar eine zufällige Zeichenfolge als Abfrageparameter anhängen, um eine neue Version der Seite zu garantieren.

-1

Wenn Sie GET Methode anstelle von POST verwenden, dann können wir nicht die Form Werte abgelegt. Wenn Sie window.opener.location.href = window.opener.location.href; verwenden, dann können wir die db auslösen und wir können den Wert erhalten, aber nur die Sache ist JSP ist nicht erfrischend, obwohl das Skript die Formularwerte hat.

5

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

+0

Funktioniert nicht mit einem '# Hash' – mpen

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; 
+0

Dies funktioniert nicht. Obwohl es die POST-Warnung umgeht, wird auch das Senden von Post-Variablen umgangen, die möglicherweise erforderlich sind. – iankit

+0

Fügen Sie window.location.hash dann zum Ende hinzu. –

+0

Eine vollständige URL mit Protokoll (falls nicht 80) und Parametern finden Sie unter http://bl.ocks.org/abernier/3070589. –

2
<html:form name="Form" type="abc" action="abc.do" method="get" onsubmit="return false;"> 

method="get" - löst das Problem.

dann kommt nur Warnung.

16

Ich hatte einige Probleme mit Anker/Hash-Urls (einschließlich #) nicht wiederladen mit der Lösung von Rex ...

So endete ich schließlich mit dem Entfernen der Hash-Teil:

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

hatte das gleiche Problem mit meiner Hash-URL, jetzt funktioniert es gut - danke! :) – Bohne

2

Nikl-Version nicht passieren Abfrageparameter erhalten, habe ich die folgende modifizierte Version:

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

oder in meinem Fall musste ich die oberste Seite \ Rahmen aktualisieren, so habe ich die folgende Version

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

Diese Methode funktioniert für meine Post und Get-Methode. – soniality

0

ich habe eine Funktion geschrieben, der die Seite ohne nachträgliche Vorlage nachladen und es wird mit Hashes arbeiten.

Ich mache dies, indem ich einen GET-Parameter in der URL reload hinzufüge/modifiziere, 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 wollen, setzen es auf diese Weise: href="javascript:reload();void 0;" es, erfolgreich zu arbeiten.

Der Nachteil meiner Lösung ist, dass es die URL ändert, so dass dieses "Reload" kein echtes Reload ist, sondern eine Ladung mit einer anderen Abfrage. Trotzdem könnte es Ihren Bedürfnissen entsprechen, so wie es für mich ist. Diese

0

arbeitete

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

Der Grund, es nicht ohne die

return false;
funktioniert hat, ist, dass zuvor behandelt, dass als eine Form Submit-Button. Mit einem expliziten Rückgabewert false wird das Formular nicht gesendet und es wird nur die Seite neu geladen, die ein Ergebnis eines vorherigen POST auf dieser Seite war.