如何清除 iFrame 的缓存?

6

我有一个网页,想要刷新一个 iFrame。我试图使用像 <input /> 按钮和 JavaScript 这样的东西来实现。但是我似乎无法在不清除缓存的情况下重新加载 iFrame。如果能让 PHP 清除缓存就更好了。

编辑更新:

以下是可行的内联实现。

    <input type="button"  onClick="javascript: var iFrame = document.getElementById('compilePreview'); iFrame.src = '<? echo ($myFile); ?>?random=' + (new Date()).getTime() + Math.floor(Math.random() * 1000000);" value="Reload Preview" />
    <iframe id="compilePreview" src="<? echo ($myFile); ?>" width="940"></iframe>

当然,后续的onload很快就会出现,消除了按钮的需要。
    <script>
    window.onload=refreshIframe;
    function refreshIframe(){
    var iFrame = document.getElementById('compilePreview');
    iFrame.src = '<? echo ($myFile); ?>?random=' + (new Date()).getTime() + Math.floor(Math.random() * 1000000);
    }
    </script>

你能展示一下你正在尝试重新加载 iframe 的确切方法吗? - Lee Taylor
你能否在 iframe 的 URL 后面添加一个缓存破坏器?类似于 url + "?ts=" + new Date().getTime() - olore
是的,在实现上有点脑抽了。现在正在运行,感谢jfriend00让齿轮转动起来。 - Jarrett Mattson
3个回答

18

第一种选择可能是通过你的 Web 服务器对 iframe 页面进行浏览器缓存控制,可以使用 HTTP 标头或者 <meta> 标签(详见 参考资料)。

<meta HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<meta HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
如果你无法更改这些内容,那么你可以在iframe中设置一个`.src`,每次使用不同的查询参数来避免缓存问题。
例如:
iframeObj.src = "http://www.example.com/page/myframe.html?random=" + (new Date()).getTime() + Math.floor(Math.random() * 1000000);

1
我对此有一点小疑问。如果我们这样做,页面将在任何时候都不会被缓存,因此会导致更长的加载时间,是否有方法只在页面过期时清除缓存? - Thirumalai murugan
@Thirumalaimurugan - 你可以在HTML或服务器的HTTP头中设置特定的过期时间。页面缓存策略是一个复杂的主题,这里不会在评论中解释。 - jfriend00
随机URL不是一个好的方法。它会导致搜索引擎中出现冗余页面。 - Bhavesh G
那么对于不允许使用脚本的情况呢? - Sean Halls
@SeanHalls - 好的,问题的整个前提是由一段JavaScript触发的刷新操作,因此显然需要运行JavaScript才能实现该场景。如果您有不涉及JavaScript的不同场景,请编写自己的问题并描述该特定场景。如果您希望我查看新问题,可以在此处留下链接评论。 - jfriend00

2
这是在服务器端完成的操作,通过HTTP头控制,如下所示:
<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sun, 29 Jul 2012 00:00:00 GMT"); // some day in the past

1
尝试过了,但iFrame在子页面中。也尝试在HTML文件编译后进行操作。仍然需要按下“刷新预览”按钮,感谢jfriend00的帮助。无论如何都很感激。 - Jarrett Mattson

1
你可以做这样的事情:
<iframe src="<?php echo $url.'#nocache'.time(); ?>">
#document</iframe>

这将允许在URL中使用GET参数,而无需担心要使用还是&来表示随机符号。

#不发送“#”后面的部分到服务器,因此我认为它不会影响缓存。 - Philipp Kyeck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接