刷新iFrame(缓存问题)

时间:2010-03-26 15:40:18

标签: javascript html iframe

我们遇到一个奇怪的问题,我们不确定究竟是什么导致它。让我详细说明这个问题。假设我们有两个不同的html页面a.html和b.html。还有一个用index.html编写的小脚本:

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

服务器组件不断更新文件a.html和b.html。问题是两个文件的内容在服务器端成功更新。如果我们打开,我们可以看到更新的更改,但客户端获取的旧内容未显示更新的更改。

有什么想法吗?

6 个答案:

答案 0 :(得分:24)

在a.html和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>

强制禁止缓存检查

答案 1 :(得分:9)

如果您可以向这些HTML文件添加服务器端指令,您可以发送相应的标头以防止缓存:

Making sure a web page is not cached, across all browsers(我认为共识是第二个答案是最好的,而不是被接受的答案)

Simone的答案已经处理了Meta标签。

一个便宜的快速技巧是添加一个随机数作为GET参数:

page_1.html?time=102398405820

如果每次请求都改变了(例如使用当前时间),每次重新加载都会被强制。

答案 2 :(得分:8)

尝试以下内容:

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

即使浏览器缓存了iframe,也会强制重新加载iframe

答案 3 :(得分:0)

对于一个可能的解决方案,将“缓存参数”传递给您对a.html和b.html的调用。例如

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=" + cacheParamValue;
    reloadFrame(document.getElementById('myFrame'), url);
}

答案 4 :(得分:0)

Homero Barbosa的解决方案就像一个魅力。就我而言,我在页面上有不同数量的iframe,所以我做了以下几点:

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

答案 5 :(得分:0)

我想把 Vishwas comment 作为一个单独的答案,扩展 Pekka’s answer

//ensure iframe is not cached
function reloadIframe(iframeId) {
    var iframe = document.getElementById(iframeId);
    var d = new Date();
    if (iframe) {
        iframe.src = iframe.src + '?ver=' + d.getTime();
        //alternatively frameElement.contentWindow.location.href = frameElement.src; //This will force the iframe to be reloaded even if it was cached by the browser
    }
}
reloadIframe('session_storage_check');