2012-05-01 19 views
2

我們有一個網頁,通常通過單擊F5或Ctrl-R來重新加載網頁,以便查看是否有新數據到達。如何在全高速緩存使用中手動觸發F5鍵和手動重新加載頁面

此頁面上的所有圖片永遠有一個緩存標題,所以不應該被瀏覽器重新加載。

但是,當用戶按下F5時,大多數瀏覽器會檢查每個緩存條目是否包含請求和if-modfied-since標頭。我們的HTML頁面永遠不會被緩存,但圖像應該被緩存很長時間,並且不需要詢問圖像是否被修改。這是一個無用的請求,我們希望擺脫它。

我們在頁面上有一個重新加載圖標,但用戶仍然會使用鍵盤重新加載(我寧願)。

於是,我就觸發F5和Ctrl-R鍵和手動完成重裝這樣的(順便說一句,我們使用jQuery):

<img src="someimg.png" /> 
<a id="reload" href="mypage.html">Reload</a>  
<script type="text/javascript"> 
function loading() { 
    window.location.href = $('#reload').attr("href"); 
    return false; 
} 

function isF5(e) { 
    return e.which == 116; 
} 
function isCtrlR(e) { 
    return e.ctrlKey &amp;&amp; e.which == 82; 
} 

function triggerReloadKeys(e) { 
    if (isF5(e) || isCtrlR(e)) { 
     $('#reload').click(); 
    } 
} 
$(document).bind("keydown", triggerReloadKeys); 
$('#reload').click(loading); 

someimg.png總是用長交付持久緩存指令。

我的第一個答案是告訴我不要接管用戶瀏覽器,並讓他刷新,如果他想。你是對的,但是我們在高峯時間高達5000頁/秒。甚至更多的圖像,因爲每個人都在重新加載頁面。我們只是想減少請求的數量,不管它們有多快。 (並且我知道我無法觸發菜單欄中的瀏覽器刷新按鈕,但我現在不關心它)。

我們非常成功地減少了我們應用程序中的請求數量,因爲我們沒有任何重新加載按鈕或F5,但是每個人都被迫使用我們自己的HTML重新加載鏈接。

什麼是可能是一起禁用F5鍵這樣的:

function triggerReloadKeys(e) { 
    if (isF5(e) || isCtrlR(e)) { 
     return false; 
    } 
} 

我不知道,如果它甚至有可能觸發F5並同時仍使用緩存強制重載和模仿行爲點擊頁面上的另一個鏈接。

任何想法?

+0

怎麼樣使用一些ajax和使用僞推動保持頁面最新。我想大多數人會在自動獲取最新數據時停止手動重新加載頁面。 (例如。德國足球聯賽直播表) –

+0

人們不要等待,他們只是多次按F5 – Janning

回答

5

我假設你還沒有得到你的答案。

這是我使用在我的網站是什麼:

var ctrlDown = false; 
var ctrlKey = 17, f5Key = 116, rKey = 82; 

$(document).keydown(function(e) { 
    if(e.keyCode == f5Key) 
    { 
     //F5 pressed. Copy your code here or try 
     //window.location = window.location; 
     //It will avoid if-modified-since requests. 
     e.preventDefault(); 
    } 

    if(e.keyCode == ctrlKey) 
     ctrlDown = true; 
    if(ctrlDown && (e.keyCode == rKey)) 
    { 
     //Ctrl + R pressed. Do whatever you want 
     //or copy the same code here that you did above 
     e.preventDefault(); 
    } 

}).keyup(function(e) { 
    if (e.keyCode == ctrlKey) 
     ctrlDown = false; 
}); 

希望它爲你工作。

+0

正是我需要的。如果用戶點擊FF上的刷新按鈕而不是重新加載,會怎麼樣? –

+0

該代碼可防止在F5鍵按下或Ctrl + R組合按下時重新加載頁面。你可以調整它來改變它的行爲。如果你想正常加載頁面,你可以在'e.preventDefault();'之後添加'top.location = top.location;'。 –

1

您試圖在錯誤的地方(即在客戶端)解決此問題。

如果您的圖片真的永遠不會改變,那麼請在服務器端上爲這些圖片添加遠端Expires http標頭。這樣,瀏覽器緩存不會嘗試查看圖像是否已更新,因爲緩存指令確保它不會。

+0

請閱讀我的問題!我使用緩存永遠聲明,但瀏覽器仍然請求在F5上的圖像。我將對我的問題進行更新... – Janning

+0

根據我的經驗,刷新只會重新請求*可能*陳舊的網址和相關資源。像這樣的圖像只能在* hard *刷新(shift-ctrl-R或Safari上的alt-cmd-R)上重新請求。你能鏈接到你正在創建的頁面,這樣我們可以看到,也許你的頭文件有問題? –

0
<body onload="JavaScript:document.body.focus();" onkeydown="return showKeyCode(event)"> 
</body> 
<script src="<?php echo $this->webroot; ?>assets/global/plugins/jquery.min.js" type="text/javascript"></script> 
<script> 
     var version = navigator.appVersion; 

     function showKeyCode(e) { 
      var keycode = (window.event) ? event.keyCode : e.keyCode; 

      if ((version.indexOf('MSIE') != -1)) { 
       if (keycode == 116) { 
        event.keyCode = 0; 
        event.returnValue = false; 
        return false; 
       } 

       if (keycode != 154) { 
        event.keyCode = 0; 
        event.returnValue = false; 
        return false; 
       } 
       if (keycode != 123) { 
        event.keyCode = 0; 
        event.returnValue = false; 
        return false; 
       } 
      } 
      else { 
       if ((keycode == 116)||(keycode != 123)||(keycode != 154)) { 
        return false; 
       } 
      } 
     } 
</script> 
+0

thnx Avhinav singh maurya :) –