2010-03-26 6 views
16

Nous avons un problème étrange sur lequel nous ne savons pas exactement ce qui le cause. Laissez-moi élaborer la question. Supposons que nous ayons deux pages html différentes: a.html et b.html. Et un petit script écrit en index.html:Actualiser iFrame (Cache Issue)

<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> 

Un composant serveur est mise à jour en permanence les fichiers a.html et b.html. Le problème est que le contenu des deux fichiers est mis à jour avec succès côté serveur. Si nous ouvrons nous pouvons voir les changements mis à jour mais le client obtenant le contenu plus ancien qui n'affiche pas les changements mis à jour.

Une idée?

Répondre

23

Ajouter ce dans a.html et 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> 

Pour forcer aucune vérification de cache

+3

@Ben - il n'y a rien à suggérer XHTML est utilisé dans cette question. Par exemple, les entrées n'ont pas de balises de fermeture non plus. – Fenton

+0

Cette solution ne fonctionne pas pour moi, s'il vous plaît vérifier [cette question] (http://stackoverflow.com/questions/22451674/wrong-content-when-refresh-a-page-contains-iframes-in-ie) – dencey

0

Pour une solution à cela, passer un "paramètre de cache" à vos appels à a.html et b.html. Par exemple

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 vous pouvez ajouter des instructions côté serveur pour les fichiers HTML, vous pouvez envoyer les en-têtes appropriées pour empêcher la mise en cache:

Making sure a web page is not cached, across all browsers (Je pense que le consensus est que la deuxième réponse est la meilleure, pas la acceptée)

La réponse de Simone traite déjà des balises Meta.

Un truc rapide pas cher est d'ajouter un nombre aléatoire en tant que paramètre GET:

page_1.html?time=102398405820 

si cela change à chaque demande (par exemple en utilisant l'heure actuelle), rechargeant wil se forcé chaque fois, aussi.

+0

Une mise en garde avec une implémentation naïve de l'astuce des nombres aléatoires est que vous pouvez vous retrouver avec des URLs comme '" page_1.html? Time = 123? Time = 456? Time = 789? Time = 012 "' sur invocations répétées. Inoffensif, mais à mon humble avis. –

6

Essayez quelque chose comme ce qui suit:

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

Cela forcera l'iframe à recharger, même si elle a été mise en mémoire cache par le navigateur

+0

Est-ce documenté quelque part? –

+0

Je ne sais pas pourquoi cela fonctionne, mais cela fonctionne réellement! +1 – Gogol

0

Solution de Homero Barbosa a travaillé comme un charme. Dans mon cas, j'ai eu un nombre variable de iframes sur la page, alors je l'ai fait ce qui suit:

$('.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; 
});