2010-10-20 82 views
1

我有一個頁面可以在單個頁面加載中多次執行相同的JSONP請求。在大多數瀏覽器中,這可以正常工作,但Safari會在本地緩存響應,直到頁面重新加載。即使當我在迴應中發回Cache-Control:no-cache標頭時也是如此。Safari在本地緩存JSONP請求

考慮下面的示例代碼:

var plcbCnt = 0; 
var plcb = "plcb" + plcbCnt; 
while(window[plcb]){ 
    plcb = "plcb" + (++plcbCnt); 
} 

$.ajax({ 
    "url": "http://myserver.com/echoDate", 
    "dataType": 'jsonp', 
    "jsonp": "cb", 
    "jsonpCallback": plcb, 
    "success": function(resp){ 
     $("#pants").html($("#pants").html() + resp + "<br/>"); 
    } 
}); 

首先要求退貨:

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Length: 28 
Content-Type: application/javascript 
Expires: -1 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 2.0.50727 
Set-Cookie: ASP.NET_SessionId=g0zwq2qiaheh4145cudddmjo; path=/ 
X-Powered-By: ASP.NET 
Date: Wed, 20 Oct 2010 18:22:12 GMT 

plcb0('634231777326425375'); 

的後續調用從本地緩存服務,而不是擊中應該像他們的服務器。

您可能想知道在開始時多餘的部分是關於設置回調函數的。我可以在那裏使用一個隨機數字,對吧? 不是。根據請求的URL,我們通過緩存整個輸出來避免額外的渲染工作。因此,如果我在每個請求上更改回調函數名稱,則會失去服務器緩存的優勢。

我能想到的最好的方法是在請求中添加一個垃圾參數,並在製作緩存鍵時使URL中的服務器緩存條脫離。但我想先看看是否有更好的選擇......關於Safari的一些我不知道的東西。

+0

你爲什麼不使用getJSON? http://api.jquery.com/jQuery.getJSON/最後做同樣的事情。 – epascarello 2010-10-20 20:04:01

+0

getJSON沒有靈活性來定義我正在做的回調。依靠默認設置,每次都會創建一個隨機數。 – 2010-10-20 20:32:16

回答

0

好像它發生在IE瀏覽器也可以在Ajax調用緩存設置爲false:

$.ajax({ 
    /*cache: false,*/ 
    "url": "http://myserver.com/echoDate", 
    "dataType": 'jsonp', 
    "jsonp": "cb", 
    "jsonpCallback": plcb, 
    "success": function(resp){ 
     $("#pants").html($("#pants").html() + resp + "<br/>"); 
    } 
}); 
+0

cache = false只是添加了我在問題末尾提到的垃圾參數。 (至少,我認爲就是這樣) – 2010-10-20 19:29:12

+0

(重複檢查jQuery源代碼,就是這樣) – 2010-10-20 19:34:22

1

嘗試增加一個哈希參數 - 瀏覽器會認爲這是一個新的請求,並不會使用它的緩存,但是在做出請求之前,超出散列的所有內容都會被剝離出來。給這個旋轉,看看它的工作原理:

var callback = '#call' + new Date().getTime(); 
$.ajax({ 
    "url": "http://myserver.com/echoDate" + callback, 
    "dataType": 'jsonp', 
    "jsonp": "cb", 
    "jsonpCallback": plcb, 
    "success": function(resp){ 
     $("#pants").html($("#pants").html() + resp + "<br/>"); 
    } 
});