2012-02-13 21 views
1

我正在本地開發。和我使用AJAX驗證碼:當xmlhttp請求時,IE9從緩存(可用時)而不是服務器加載

function getChart(num,ld,margin,idr) 
{ 
    idr = typeof(idr) != 'undefined' ? idr : 0; 
    $(ld).style.display="inline-block"; 
    if (window.XMLHttpRequest) 
    { 
     // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
    } 
    else 
    { 
     // code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange=function() 
    { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) 
     { 
      $(ld).style.display="none"; 
      //to place boxes next to each other 
      $("sign_"+num).style.margin=(margin+7)+"px 590px 0 0"; 
      if(num=="ph"&&$("sign_fx").style.marginTop==$("sign_"+num).style.marginTop&&$("sign_fx").style.marginRight=="590px") 
      { 
       $("sign_"+num).style.marginRight="605px"; 
      } 
      else if(num=="fx"&&$("sign_ph").style.marginTop==$("sign_"+num).style.marginTop&&$("sign_ph").style.marginRight=="590px") 
      { 
       $("sign_"+num).style.marginRight="605px"; 
      } 
      else if(num=="fx") 
      { 
       $("sign_ph").style.marginRight="590px"; 
      } 
      else if(num=="ph") 
      { 
       $("sign_fx").style.marginRight="590px"; 
      } 
      $("sign_"+num).style.display="block"; 
      $(num+"_request_ld").style.display="none"; 
      $(num+"_request_all").style.display="block"; 
      $(num).style.display="block"; 
      $(num+"_request").innerHTML=xmlhttp.responseText; 
     } 
    } 
    xmlhttp.open("GET","barchart.php?idu=<?php echo $id_signed_in;?>&num="+num+"&idr="+idr,true); 
    xmlhttp.send(); 
} 

當參數在getChart功能相同(意思getChart被稱爲具有相同的參數),IE加載從緩存和不打擾調用服務器即使在刷新頁面時也是如此。在刪除緩存時,它從服務器獲取數據。這是因爲我在本地開發?

+0

您是否嘗試過在你請求的末尾添加一個隨機參數到barchart.php? – j08691 2012-02-13 15:25:41

+0

是的,通過將它們分配給'getChart'函數,它首次從服務器加載它們,然後在重複時使用從catch中加載的參數進行重複,這意味着不會捕獲數據庫中的任何更改。它一直這樣做,直到我刪除捕獲然後它開始了同樣的問題。 – 2012-02-13 15:29:30

+0

由於您使用的是jQuery或其他lib,因此您應該使用庫的Ajax調用,而不是滾動自己的。 (你不應該測試IE6的ActiveObjects等) – 2012-02-13 15:43:00

回答

0

從緩存中加載是一項功能,而不是一個錯誤。要打敗它,請添加緩存清除參數,例如

xxx= <new Date().getTime();> // note, this is meta-code. 

或者只是維護計數器。在任何情況下,相同的GET URL(包括參數)將導致返回緩存的值。所以你需要強制這些網址與衆不同。

或者使用POST而不是GET。

換句話說,HTTP GET調用的基本思想是它們是idempotent。這意味着調用(通過GET)http://server.com?a=1&b=2應該總是返回相同的答案。既然是這樣,那麼響應可以(也應該)被緩存。

因爲,很明顯,你是不是每次調用返回相同的答案,您的網址是冪等。從架構的角度來看這並不好。當您第一次遇到瀏覽器緩存問題時,您可能也會遇到與客戶端到服務器之間的多個緩存點上的緩存問題。例如緩存代理服務器等。

上面描述的緩存清除技術(向URL添加更改參數)將起作用。但更好的是使用POST請求。

新增

Caching assumptions在HTTP是複雜的。當我說HTTP GET url應該是冪等的時,我簡化了一些東西。根據HTML正文中的標題值和元標題標記,可以更改特定GET URL的結果。在默認的簡單情況下,瀏覽器和中間緩存點的假設是GET是冪等的。

由於典型的簡單數據響應結果並未明確設置緩存頭,因此假設結果可以被緩存。因此OP遇到的問題。

+0

你的回覆非常翔實。非常感謝。使用具有隨機值的附加參數可以解決問題。兩個'GET' URL將會是相同的。然而使用POST很容易和直接。在我應該注意的AJAX中使用'POST'有什麼缺點。 「Jun1st」在他的回覆中表示「不推薦」,沒有理由。 – 2012-02-13 20:20:05

+0

Ajax經常通過POST完成。主要問題是語義。如果您的調用只是獲取最新的數據,那麼帶有緩存清除參數的GET就是一種可行的方法。如果您的通話改變了服務器上的某些內容並獲取最新數據,請使用POST。 – 2012-02-14 03:54:08

0

我發現解決這個問題的一種方法是使用「緩存攔截器」 - 即將隨機生成的數字附加爲請求的參數。該參數不應與服務器期望的任何名稱相同,因此它將被忽略,但它會欺騙IE將其識別爲新請求。

欲瞭解更多信息,請參閱IE Cache and AJAX: Cache Busting Ajax requests

0

擴大你帶有某種隨機數據例如xmlhttp.open barchart.php?.... & _cache = RANDVALUE 這樣瀏覽器每次都會重新請求數據。

替代地你必須發送它即可以防止高速緩存使用jQuery.ajax服務器側

1
  1. 數據並設置cache:false不是使從stratch的請求。
  2. 設置Expire你的反應,這是通過使用POST代替GETbarchar.php
  3. 產生的,它會解決你的問題,但不建議
+0

爲什麼不推薦使用'POST'? – 2012-02-13 19:55:18

+0

POST應該更新/添加服務器中的一些新數據。 GET用於從服務器檢索數據。這是HTTP 1.1中的定義。 POST會工作的原因是POST從來沒有緩存 – fengd 2012-02-14 02:12:19

+0

有同樣的問題,我使用了cache:false這個技巧。這意味着我不需要爲IE添加額外的參數。 – 2012-07-12 13:55:39

相關問題