2010-03-26 173 views
16

我們遇到了一個奇怪的問題,我們不確定究竟是什麼原因導致問題。讓我詳細說明這個問題。假設,我們有兩個不同的html頁面a.html和b.html。並寫入index.html的一個小腳本:刷新iFrame(緩存問題)

<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。問題是兩個文件的內容都在服務器端成功更新。如果我們打開,我們可以看到更新的更改,但客戶端獲取的舊內容不顯示更新的更改。

有什麼想法?

回答

23

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

要強制不緩存檢查

+3

@Ben - 有什麼建議XHTML在這個問題上被使用。例如,輸入也沒有結束標籤。 – Fenton 2012-01-27 15:51:10

+0

此解決方案不適合我,請檢查[此問題](http://stackoverflow.com/questions/22451674/wrong-content-when-refresh-a-page-contains-iframes-in-ie) – dencey 2014-03-18 02:58:12

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

如果你可以添加服務器端指令的HTML文件,你可以發送適當的報頭,以防止緩存:

Making sure a web page is not cached, across all browsers (我認爲共識是第二答案是最好的,而不是接受的)

Simone的回答已經處理Meta標籤。

一個廉價的快速訣竅是添加一個隨機數作爲一個GET參數:

page_1.html?time=102398405820 

如果這改變了在每次請求(例如,使用當前時間),西港島線重載得到強制每一次,太。

+0

隨機數字技巧的一個天真的實施的一個警告是,你可以在重複的調用時以'「page_1.html?time = 123?time = 456?time = 789?time = 012」'來結束。無害,但醜陋的恕我直言。 – 2010-03-26 15:59:45

6

嘗試類似如下:

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

這將迫使IFRAME即使它是由瀏覽器

+0

這是記錄在任何地方嗎? – 2012-11-29 11:30:10

+0

不知道爲什麼這個工程,但它實際上工作! +1 – Gogol 2017-05-20 11:15:13

0

奧梅羅巴博薩的解決方案工作就像一個魅力緩存重新加載。就我而言,我有不同數量的網頁上的I幀,所以我做了以下內容:

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