php - query - update codeigniter example
Forzar recarga/actualización al presionar el botón Atrás (13)
Haré todo lo posible para explicar esto.
Tengo una aplicación que muestra los más de 50 proyectos en mi página de view
. El usuario puede hacer clic en el proyecto individual y acceder a la página de actualización para actualizar la información del proyecto. Todo funciona bien, excepto después de que el usuario termine de actualizar la información del proyecto individual y presione el botón "Atrás" en el navegador hacia la view page
anterior. La información del proyecto anterior (antes de la actualización) todavía está allí. El usuario debe presionar actualizar para ver la información actualizada. No es tan malo, pero deseo brindar una mejor experiencia de usuario. Alguna idea para arreglar esto? Muchas gracias.
Bueno, podría proporcionar un botón de retroceso integrado en la página de actualización que los enviará a él como nuevo (como un enlace <a href="<?= $_SERVER[''HTTP_REFERRER'']; ?>">BACK</a>
o ponga algún script en la página que lo obligue a extraer datos cada vez que se golpea la página, ya sea una nueva impresión o si se utilizó el botón Atrás.
Puede enviar encabezados HTTP en su página de visualización que le dicen al navegador que la página no se puede almacenar en caché. Esto significa que el navegador deberá solicitar la página del servidor cada vez que se acceda, lo que significa que siempre muestra información actualizada.
Los encabezados deben enviarse antes que cualquier otro contenido, por lo que debe colocar lo siguiente en la parte superior de la página de visualización.
header("Cache-Control: no-cache, must-revalidate");
Creo que debes trabajar con JS para que esto funcione, ya que no hay forma de que PHP sepa a qué controladores del navegador tiene acceso el usuario ...
Tal vez esto ayude: http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript
he aquí una solución que he usado en algunas de mis páginas. agréguelo a las páginas en las que se realizan los cambios.
window.onbeforeunload = function() {
window.name = "reloader";
}
esto se dispara cuando sales de esas páginas. también puede activarlo si se realizaron cambios. para que no recargue innecesariamente la página que necesita recargarse. luego, en las páginas que desea volver a cargar después de usar el navegador "atrás".
if (window.name == "reloader")
{
window.name = "no";
reloadPage();
}
esto disparará una recarga en la página que necesita volver a cargar ... espero que esto ayude :) por cierto esto está en js.
El "fb-cache" puede ser realmente molesto. Aquí hay una forma simple de javascript a su alrededor:
window.onpageshow = function(evt) {
// If persisted then it is in the page cache, force a reload of the page.
if (evt.persisted) {
document.body.style.display = "none";
location.reload();
}
};
Probado en Safari 6 e IE10.
Uso un jquery y un script php para forzar la recarga en el botón de retroceso. La parte window.unload solo se necesita en Firefox. La parte de tiempo agotado de Outout de 1 segundo y el anexo de cuerpo es solo una ilustración de la funcionalidad. window.location.reload (true) dará el mismo resultado que window.location.href = window.location.href;
jquery:
<script>
$(window).unload(function() {});
$.get(''h.php'',function(data){
if($.trim(data)==''first''){
// $(''body'').append(data)
// setTimeout(function(){
window.location.href = window.location.href;
// },1000)
}
else {
// $(''body'').append(data)
}
});
</script>
h.php:
<?php session_start(); ?>
<?php
if(!$_SESSION[''reloaded'']){
echo ''first'';
$_SESSION[''reloaded'']=1;
}
else {
echo ''second'';
unset($_SESSION[''reloaded'']);
}
?>
hacer una casilla de verificación oculta y usar el código a continuación (coffeescript)
window.location.reload() if $("#refreshCheck")[0].checked
$("#refreshCheck")[0].checked = true
if (window.name == "reloader") {
window.name = "";
location.reload();
}
window.onbeforeunload = function() {
window.name = "reloader";
}
Agregue estas dos funciones en cada página
Yo uso estas cuatro líneas de código PHP:
// any valid date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
// always modified right now
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// HTTP/1.1
header("Cache-Control: private, no-store, max-age=0, no-cache, must-revalidate, post-check=0, pre-check=0");
// HTTP/1.0
header("Pragma: no-cache");
La clave está utilizando la cláusula "sin almacenamiento" del encabezado Cache-Control.
Esta es la solución que he usado:
<?php
session_start();
if (!$_SESSION[''reloaded'']) {$_SESSION[''reloaded''] = time();}
else if ($_SESSION[''reloaded''] && $_SESSION[''reloaded''] == time()) { ?>
<script>
location.reload();
</script>
<?php } ?>
Afortunadamente, no es necesario que admita navegadores por debajo de IE10, por lo que si está dispuesto o tiene el privilegio suficiente para admitir solo navegadores compatibles con HTML5, lo siguiente debería funcionar:
/*
* The following is intentional, to force Firefox to run
* this JS snippet after a history invoked back/forward navigation.
*/
window.onunload = function(){};
function formatTime(t) {
return t.getHours() + '':'' + t.getMinutes() + '':'' + t.getSeconds();
}
if (window.history.state != null && window.history.state.hasOwnProperty(''historic'')) {
if (window.history.state.historic == true) {
document.body.style.display = ''none'';
console.log(''I was here before at '' + formatTime(window.history.state.last_visit));
window.history.replaceState({historic: false}, '''');
window.location.reload();
} else {
console.log(''I was forced to reload, but WELCOME BACK!'');
window.history.replaceState({
historic : true,
last_visit: new Date()
}, '''');
}
} else {
console.log(''This is my first visit to '' + window.location.pathname);
window.history.replaceState({
historic : true,
last_visit: new Date()
}, '''');
}
Bueno, aquí está el código sin comentarios y flab:
window.onunload = function(){};
if (window.history.state != null && window.history.state.hasOwnProperty(''historic'')) {
if (window.history.state.historic == true) {
document.body.style.display = ''none'';
window.history.replaceState({historic: false}, '''');
window.location.reload();
} else {
window.history.replaceState({historic : true}, '''');
}
} else {
window.history.replaceState({historic : true}, '''');
}
Quédate justo antes de la etiqueta corporal de cierre, y tendrás una solución bastante limpia.
Esto funcionará con cualquier combinación de atrás / adelante que se haga clic, y en el momento en que el usuario aterrice en una nueva página, no se realizará ninguna recarga forzada.
Obtenga más información sobre el objeto Historial en MDN:
Ninguna de las soluciones anteriores funcionó para mí. Esta sencilla solución publicada aquí funcionó ...
Intenté obligar a que el navegador vuelva a descargar una página cuando el usuario hace clic en el botón Atrás, pero no funcionó. Parece que los navegadores modernos tienen caché separada para páginas, que almacena el estado completo de una página (incluidos los elementos DOM generados por JavaScript), de modo que cuando los usuarios presionan el botón Atrás, la página anterior se muestra instantáneamente en el estado que el usuario dejó. Si desea forzar que el navegador vuelva a cargar la página en el botón Atrás, agregue onunload = "" a su elemento de cuerpo HTML (X):
<body onunload="">
Esto desactiva la memoria caché especial y fuerza la recarga de la página cuando el usuario presiona el botón Atrás. Piensa dos veces antes de usarlo. El hecho de necesitar tal solución es una pista de que el concepto de navegación de su sitio es defectuoso.
después de días de búsqueda en la red para encontrar una solución, finalmente lo resuelvo, agrego después:
<script>
window.onbeforeunload = function(){window.location.reload();}
</script>
esto funcionará como un encanto me lo agradecerás
este código volverá a cargar la página cada vez que la visite.