2010-03-26 15 views
16

Estamos recibiendo un problema extraño sobre el que no estamos seguros de qué es exactamente lo que lo causa. Déjame explicar el problema. Supongamos que tenemos dos páginas html diferentes a.html y b.html. Y un pequeño script escrito en index.html:Actualizar iFrame (problema de caché)

<html> 

<head> 
    <script> 
    function reloadFrame(iframe, src) { 
     iframe.src = src; 
    } 
    </script> 
</head> 

<body> 
    <form> 
     <iframe id="myFrame"></iframe> 
     <input type="button" value="Load a.html" onclick="reloadFrame(document.getElementById('myFrame'), 'a.html')"> 
     <input type="button" value="Load b.html" onclick="reloadFrame(document.getElementById('myFrame'), 'b.html')"> 
    </form> 
</body> 

</html> 

componente Un servidor está actualizando continuamente ambos archivos a.html y b.html. El problema es que el contenido de ambos archivos se está actualizando correctamente en el lado del servidor. Si abrimos podemos ver los cambios actualizados pero el cliente obtiene el contenido anterior que no muestra los cambios actualizados.

¿Alguna idea?

Respuesta

23

Añadir esto en a.html y b.html

<head> 
    <meta http-Equiv="Cache-Control" Content="no-cache" /> 
    <meta http-Equiv="Pragma" Content="no-cache" /> 
    <meta http-Equiv="Expires" Content="0" /> 
</head> 

Para forzar ninguna comprobación de caché

+3

@Ben - no hay nada que sugiera XHTML se está utilizando en esta pregunta. Por ejemplo, las entradas tampoco tienen etiquetas de cierre. – Fenton

+0

Esta solución no me funciona, compruebe [esta pregunta] (http://stackoverflow.com/questions/22451674/wrong-content-when-refresh-a-page-contains-iframes-in-ie) – dencey

0

Para una posible solución a esto, pasar un "parámetro de caché" para sus llamadas a a.html y b.html. Por ejemplo

HTML

<input type="button" value="Load a.html" onclick="cacheSafeReload('a.html');"> 

Javascript

function cacheSafeReload(urlBase) { 
    var cacheParamValue = (new Date()).getTime(); 
    var url = urlBase + "?cache=" + cacheValueParam; 
    reloadFrame(document.getElementById('myFrame'), url); 
} 
8

Si puede añadir instrucciones del lado del servidor a los archivos HTML, puede enviar las cabeceras apropiadas para evitar el almacenamiento en caché:

Making sure a web page is not cached, across all browsers (Creo que el consenso es que la segunda respuesta es la mejor, no la aceptada)

La respuesta de Simone ya se ocupa de las etiquetas Meta.

Un truco rápido barato es añadir un número aleatorio como un parámetro GET:

page_1.html?time=102398405820 

si esto cambia en cada petición (por ejemplo, utilizando la hora actual), recarga forzada wil consigue cada vez, también.

+0

Una advertencia con una implementación ingenua del truco de números aleatorios es que puede terminar con urls como '" page_1.html? Time = 123? Time = 456? Time = 789? Time = 012 "' en repetidas invocaciones. Inofensivo, pero desagradable en mi humilde opinión. –

6

intentar algo así como lo siguiente:

<script> 
    var frameElement = document.getElementById("frame-id"); 
    frameElement.contentWindow.location.href = frameElement.src; 
</script> 

Esto forzará el iframe se vuelva a cargar incluso si se almacena en caché por el navegador

+0

¿Está documentado en alguna parte? –

+0

No estoy seguro de por qué funciona, pero en realidad funciona !!!! +1 – Gogol

0

Solución de Homero Barbosa funcionó de maravilla. En mi caso, tenía un número variable de iframes en la página, así que hice lo siguiente:

$('.some_selector').each(function() { 
    var $randid = Math.floor(Math.random() * 101); 
    $(this).attr({'id': 'goinOnaSafari-' + $randid}); 

    var $frame = document.getElementById('goinOnaSafari-' + $randid); 
    $frame.contentWindow.location.href = $frame.src; 
}); 
Cuestiones relacionadas