2009-02-20 21 views
54

que desea volver a cargar una página usando:¿Cómo recargo una página sin una advertencia POSTDATA en Javascript?

window.location.reload(true); 

pero recibo el aviso POSTDATA debido a que la función de actualización quieren volver a enviar los datos del formulario post anterior. ¿Cómo puedo actualizar mi página sin esta advertencia?

ACTUALIZADO: ¡No tengo control del proyecto! ¡No puedo solucionar el POST en sí!

+0

volver a enviar una POST (que es lo que hace una recarga) siempre mostrará esa advertencia. Podría hacer otro POST en lugar de volver a cargar, aunque eso llenaría el historial de los navegadores de los usuarios si lo hace con demasiada frecuencia, y seguirían recibiendo la advertencia si presionan el botón Atrás. –

+1

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

Respuesta

55

Simplemente cambiar window.location en JavaScript es peligroso porque el usuario todavía podría golpear el botón atrás y vuelva a enviar el mensaje, lo que podría tener resultados inesperados (como una compra duplicado ). PRG es una solución mucho mejor

Use the Post/Redirect/Get (PRG) pattern

Para evitar este problema, muchas aplicaciones web utilizan el patrón PRG - en lugar de devolver una página HTML directamente, la operación POST devuelve un comando de redireccionamiento (mediante HTTP 303 código de respuesta (a veces 302) junto con el encabezado de respuesta HTTP "Ubicación"), indicando al navegador que cargue una página diferente utilizando una solicitud HTTP GET. La página de resultados se puede marcar o cargar de forma segura sin efectos secundarios inesperados.

+0

No tengo control del proyecto. ¡No puedo solucionar el POST en sí! – Ricibald

+0

PRG se realiza después del POST, redirigiendo silenciosamente al cliente a una página GET para que no tengan el POST en su historial. (Vale la pena mencionar quién tiene el control). Si eso es algo que no puedes hacer, ¿puedes navegar a una página GET en lugar de volver a cargar el POST? –

+3

Sí, pero redirigir un POST requiere algún tipo de control – Ricibald

101

No se puede actualizar sin la advertencia; la actualización indica al navegador que repita la última acción. Depende del navegador elegir si se debe advertir al usuario si repetir la última acción implica volver a enviar los datos.

Se podría volver a navegar a la misma página con una nueva sesión haciendo:

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

el usuario aún puede presionar el botón Atrás y volver a enviar la publicación, lo que podría tener resultados inesperados (como una compra duplicada). PRG es una solución mucho mejor. –

+0

Tal vez, pero si el usuario hace clic por cualquier razón, seguirá recibiendo una advertencia, por lo que quizás el uso de PRG dependa de las consecuencias del reenvío. – AJM

+0

cierto, si el servidor reconoce las publicaciones duplicadas no es un problema, pero al usuario todavía se le presenta un cuadro de diálogo del que preocuparse. Con PRG, el usuario nunca verá ese diálogo. –

2

Si usted está en la etapa en que haya terminado con los datos de envío y simplemente quieren ver de nuevo la página de nuevo , puede usar una ventana.location e incluso agregar una cadena aleatoria como un parámetro de consulta para garantizar una nueva versión de la página.

-1

Si utiliza el método GET en lugar de POST, no podemos rellenar los valores del formulario. Si usa window.opener.location.href = window.opener.location.href;, podemos disparar la base de datos y podemos obtener el valor, pero lo único es que JSP no es refrescante aunque el scriplet tenga los valores del formulario.

5

cómo sobre window.location.replace (window.location.href);

+0

No funciona con '# hash' – mpen

12

Para eludir la advertencia POST, debe volver a cargar la página con la URL completa. Funciona bien.

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

Esto no funciona. Aunque omite la advertencia POST, también evita enviar variables de publicación que puedan ser necesarias. – iankit

+0

Agregue window.location.hash hasta el final. –

+0

Para obtener una URL completa con el protocolo (si no es 80) y los parámetros, consulte http://bl.ocks.org/abernier/3070589. –

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

method="get" - resuelve el problema.

if method="post" entonces solo aparece la advertencia.

16

he tenido algunos problemas con el ancla/de hash-urls (incluyendo #) no volver a cargar con la solución de Rex ...

Así que finalmente terminé por eliminar la parte de hash:

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

tenía el mismo problema con mi hash-url, ahora funciona bien, ¡gracias! :) – Bohne

2

versión de Nikl no pasa obtener los parámetros de consulta, he utilizado la siguiente versión modificada:

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

o en mi caso necesitaba para actualizar la página \ marco superior, por lo que utiliza la siguiente versión

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

Este método funciona para mi publicación y método get. – soniality

0

He escrito una función que volverá a cargar la página sin envío de publicaciones y que también funcionará con hash.

Lo hago agregando/modificando un parámetro GET en la URL llamada reload actualizando su valor con la marca de tiempo actual 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; 
}; 

Tenga en cuenta, si desea activar esta función en un atributo href, poner en práctica esta manera: href="javascript:reload();void 0;" para hacer que funcione, con éxito.

La desventaja de mi solución es que cambiará la URL, por lo que esta "recarga" no es una recarga real, sino que es una carga con una consulta diferente. Aún así, podría adaptarse a sus necesidades como lo hace para mí.

0

Esto funcionó

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

La razón por la que no funcionaba sin la

return false;
es que previamente tratada como una forma de que botón de enviar. Con una devolución explícita falsa, no hace el envío de formulario y solo hace la recarga de la misma página que fue el resultado de un POST anterior a esa página.

Cuestiones relacionadas