internet explorer - retroceso - El botón Atrás del navegador restaura los campos vacíos
deshabilitar retroceso jquery (5)
IE retendrá los contenidos del formulario en un clic de botón trasero automáticamente, siempre que:
- no ha roto el almacenamiento en caché con un pragma sin caché o similar
- los campos de formulario en cuestión no fueron creados dinámicamente por script
Parece que tienes el cacheing en la mano, así que supongo que esto último puede aplicarse. (Como dice mkoeller, Firefox evita este problema si la página está en los últimos clics de retroceso manteniendo activa la página por más tiempo de lo que está en la pantalla. Sin embargo, esto es opcional, y Firefox volverá al mismo comportamiento que IE y otros navegadores una vez que hayas navegado unas páginas más adelante y haya expirado la anterior).
Si está creando sus propios campos de formulario desde la carga de scripts, entonces el navegador no tiene manera de saber que el nuevo control de entrada es ''el mismo'' que la instancia anterior, por lo que no puede completarlo con el valor previamente enviado. . En este caso, si desea que funcione bien con el botón Atrás, debe comenzar a almacenar datos en el cliente.
Luego tiene que utilizar algún tipo de clave de estado para que cada conjunto de datos esté vinculado exactamente a una instancia de la página, de lo contrario, pasar por varias instancias de la misma forma o tener dos pestañas de navegadores abiertas en el formulario a la vez confundirá seriamente tu guion
Y luego está comenzando a recopilar una gran cantidad de datos si son formularios grandes, y si el mecanismo de almacenamiento del lado del cliente que está utilizando son las cookies, puede comenzar a perder datos, así como enviar una carga de tonterías innecesarias del estado con cada solicitud HTTP. Existen otros mecanismos de almacenamiento del lado del cliente, pero son específicos del navegador.
En resumen: hacer formas generadas dinámicamente es un gran dolor y es mejor evitarlo si puedes. Tener una forma oculta en la página que una secuencia de comandos hace visible, lo que permite que los navegadores realicen su recuperación de campo en lugar de darle la tarea, es mucho más fácil.
Tengo una página web x.php
(en un área protegida con contraseña de mi sitio web) que tiene un formulario y un botón que usa el método POST
para enviar los datos del formulario y abre x.php#abc
. Esto funciona bastante bien
Sin embargo, si los usuarios deciden navegar de nuevo en Internet Explorer 7, todos los campos en el x.php
original se borran y todo debe escribirse de nuevo. No puedo guardar la información publicada en una sesión y estoy tratando de entender cómo puedo hacer que IE7 se comporte de la manera que quiero.
He buscado en la web y he encontrado respuestas que sugieren que el encabezado HTTP debe contener información de almacenamiento en caché explícita. Actualmente, he intentado esto:
session_name("FOO");
session_start();
header("Pragma: public");
header("Expires: Fri, 7 Nov 2008 23:00:00 GMT");
header("Cache-Control: public, max-age=3600, must-revalidate");
header("Last-Modified: Thu, 30 Oct 2008 17:00:00 GMT");
y variaciones de los mismos Sin éxito. Mirar los encabezados devueltos con una herramienta como WireShark me muestra que Apache realmente está honrando mis encabezados.
Entonces mi pregunta es: ¿qué estoy haciendo mal?
Busqué y este es un problema bastante difícil. También es un gran dolor en el culo para el contenido modificado dinámicamente. Visitas la página, JavaScript aumenta con tus instrucciones, pasas a la página siguiente y vuelves y javascript se ha olvidado. Y no hay forma de simplemente actualizar la página del servidor, porque la página sale de la memoria caché.
Así que ideé un botón de retroceso-caché-interruptor.
Es malo y malo para la web, pero le permite a las páginas comportarse como la gente espera que se comporten en lugar de deformarse mágicamente por todas partes.
<script type="text/javascript">//<!-- <![CDATA[
(function(){
if( document.location.hash === "" )
{
document.location.hash="_";
}
else
{
var l = document.location;
var myurl = ( l.protocol + "//" + l.hostname + l.pathname + l.search);
document.location = myurl;
}
})();
//]]> --></script>
Esto hará un poco de magia en el sentido de que detecta si la página que está / actualmente / viendo se cargó o no desde la memoria caché.
si está allí la primera vez, detectará "sin hash" y agregará " #_
" a la URL de la página. si está allí por primera vez (es decir, no es un enlace directo a la página), la página ya tiene el número #_ en ella, por lo que la elimina y, en el proceso de eliminación, desencadena una nueva página.
Puede usar autocompletar = "off" en sus campos. De esta forma, el navegador no almacenará los valores en la memoria caché para que los valores no se rellenen en el formulario cuando el usuario haga clic en el botón Atrás.
Al tratar de reducir aún más el problema, he encontrado la causa de mi problema. Estaba usando URL que estaban siendo reescritas por Apache (es decir, siempre accedí a mi página como http://foo.com/page
que está mapeada por Apache a http://foo.com/page.htm
). El uso de las URL reales resolvió el problema e hizo feliz IE7, siempre que especifique el encabezado HTTP adecuado ( Cache-Control
, Expires
, etc.).
Esto es lo que hago en el código PHP para generar encabezados que parecen hacer que todos los navegadores estén contentos con la memoria caché:
function emitConditionalGet($timestamp)
{
// See also http://www.mnot.net/cache_docs/
// and code sample http://simonwillison.net/2003/Apr/23/conditionalGet/
$gmdate_exp = gmdate(''D, d M Y H:i:s'', time() + 1) . '' GMT'';
$last_modified = gmdate(''D, d M Y H:i:s'', $timestamp) . '' GMT'';
$etag = ''"''.md5($last_modified).''"'';
// If the client provided any of the if-modified-since or if-none-match
// infos, take them into account:
$if_modified_since = isset($_SERVER[''HTTP_IF_MODIFIED_SINCE''])
? stripslashes($_SERVER[''HTTP_IF_MODIFIED_SINCE'']) : false;
$if_none_match = isset($_SERVER[''HTTP_IF_NONE_MATCH''])
? stripslashes($_SERVER[''HTTP_IF_NONE_MATCH'']) : false;
if (!$if_modified_since && !$if_none_match)
{
return; // the client does not cache anything
}
if ($if_none_match && $if_none_match != $etag)
{
return; // ETag mismatch: the page changed!
}
if ($if_modified_since && $if_modified_since != $last_modified)
{
return; // if-modified-since mismatch: the page changed!
}
// Nothing changed since last time client visited this page.
header("HTTP/1.0 304 Not Modified");
header("Last-Modified: $last_modified");
header("ETag: $etag");
header("Cache-Control: private, max-age=1, must-revalidate");
header("Expires: $gmdate_exp");
header("Pragma: private, cache");
header("Content-Type: text/html; charset=utf-8");
exit;
}
function emitDefaultHeaders($timestamp)
{
$gmdate_exp = gmdate(''D, d M Y H:i:s'', time() + 1) . '' GMT'';
$last_modified = gmdate(''D, d M Y H:i:s'', $timestamp) . '' GMT'';
$etag = ''"''.md5($last_modified).''"'';
header("Last-Modified: $last_modified");
header("ETag: $etag");
header("Cache-Control: private, max-age=1, must-revalidate");
header("Expires: $gmdate_exp");
header("Pragma: private, cache");
header("Content-Type: text/html; charset=utf-8");
}
function getTimestamp()
{
// Find out when this page''s contents last changed; in a static system,
// this would be the file time of the backing HTML/PHP page. Add your
// own logic here:
return filemtime($SCRIPT_FILENAME);
}
// ...
$timestamp = getTimestamp();
emitConditionalGet($timestamp);
emitDefaultHeaders($timestamp); //previously, this variable was mistyped as "$timestaml"
Firefox hace este tipo de almacenamiento en caché. Según entiendo tu pregunta, quieres que IE7 se comporte de la misma manera que Firefox. Creo que eso no es posible.
Firefox e IE7 difieren en la forma en que interpretan el botón Atrás.
Firefox mostrará el árbol DOM de la página anterior tal como se mostró por última vez antes de que se dejara la página. Es decir, todos los datos del formulario seguirán incluidos en el campo de entrada del formulario. Pero no verás un evento de carga al presionar el botón Atrás.
IE7 volverá a mostrar la página según la respuesta que reciba del servidor. Por lo tanto, la forma es emtpy (a menos que haya valores predeterminados enviados por el servidor originalmente), pero verá un evento onload
.