2012-01-12 29 views
63

jQuery.get()是帶有get調用的jQuery.ajax()的簡寫。但是當我在.get()調用的數據中設置cache:false時,發送給服務器的是一個名爲cache的參數,其值爲false。雖然我的意圖是發送帶有數據的時間戳到服務器以防止緩存,這是如果我在jQuery.ajax數據中使用cache: false會發生什麼情況。我如何做到這一點,而不重寫我的jQuery.get調用jQuery.ajax調用或使用如何在jQuery.get調用中設置緩存:false

$.ajaxSetup({ 
    // Disable caching of AJAX responses 
    cache: false 
}); 

更新:謝謝大家的答案。你們都是對的。但是,我希望有一種方法可以讓get調用知道您不想緩存,或將該值發送給底層的.ajax(),以便知道如何處理它。

我a。尋找比迄今已確定的三種方式以外的第四種方式:

  1. 做它全球範圍內通過ajaxSetup

  2. 使用阿賈克斯調用,而不是不用彷徨呼叫

  3. 通過在您的.get調用中添加一個持有時間戳的新參數來手動執行此操作。

我只是認爲這個功能應該被內置到.get調用中。

+1

現代化解決方案展示完整的'得到()'的例子嗎? – Jivings 2012-01-12 20:02:18

+0

我喜歡將頁面的日期/時間傳遞給頁面(假設我使用的是服務器端腳本語言),然後將頁面請求作爲查詢字符串參數傳遞給頁面。我這樣做的原因是因爲它允許緩存,除非頁面實際發生了變化。 – Archer 2012-01-12 20:07:38

+1

使用緩存:false將時間戳附加到ajax/json請求,例如 {「get」:「modified」}&_ = 1394836303603 這破壞了我的API請求。花費太多時間才能找出添加時間戳的內容,因爲它隱藏在jQuery文檔中。 而不是使用緩存:false,只需添加自己的時間戳,假設你的API不會在意你添加了一個未知的參數。像這樣: {「get」:「modified」,「timestamp」:「1394836303603」} 這也可以讓您更好地控制哪些項目被緩存,哪些不是。 – 2014-03-15 01:18:34

回答

34

對我而言,正確的做法是列出的。 ajaxajaxSetup。如果你真的想使用get而不是使用ajaxSetup,那麼你可以創建自己的參數,並給它當前日期/時間的值。

但是我會質疑你的動機不使用其他方法之一。

+1

值得注意的是,在我的特定應用程序中,我使用ajaxSetup中的cache:false(我的大部分調用都是json端點的負載),然後使用$ .ajax(...,緩存:真)任何特定的模板或我想要緩存的東西。無論如何,我更喜歡這一點,因爲它使事情變得相當明確,並且我比靜態數據調用了更多的有效負載調用。 – David 2013-02-16 19:23:23

80

自己添加參數。

$.get(url,{ "_": $.now() }, function(rdata){ 
    console.log(rdata); 
}); 

在jQuery 3.0,你現在可以這樣做:

$.get({ 
    url: url, 
    cache: false 
}).then(function(rdata){ 
    console.log(rdata); 
}); 
+5

感謝$ .now()是新Date().getTime()的簡寫。 http://api.jquery.com/jQuery.now/ – Barka 2012-01-12 21:36:14

+0

不錯,它的作品! :) – wooncherk 2013-10-28 06:12:31

+0

你現在可以做'Date.now()'。 – Jivings 2014-08-07 08:14:08

62

我認爲你必須使用AJAX方法來代替它允許你關閉緩存:

$.ajax({ 
    url: "test.html", 
    data: 'foo', 
    success: function(){ 
    alert('bar'); 
    }, 
    cache: false 
}); 
+2

IE9緩存,似乎真的不喜歡.get – Ross 2012-05-05 00:49:11

+4

@Ross它應該不會做,如果你設置'緩存'爲'false'根據我的答案。 – Jivings 2012-05-05 18:06:21

+2

3年後,我剛剛失去了半天,以完全相同的問題 – Joel 2015-02-25 22:57:55

7

根據JQuery文檔,.get()只需要url,data(內容),dataTypesuccess回調作爲其參數。你真正想要做的是在發送之前修改jqXHR對象。用.ajax(),這是通過beforeSend()方法完成的。但由於.get()是一個快捷方式,它不允許它。

雖然將.ajax()呼叫轉換爲.get()呼叫應該相對容易。畢竟,.get()只是.ajax()的子集,因此您可以使用.ajax()的所有默認值(當然,除beforeSend()外)。

編輯:

::着眼於Jivings的回答::

噢,忘了cache參數!雖然beforeSend()對於添加其他頭文件非常有用,但此處內置的cache參數要簡單得多。

+0

Upvote努力和尋找不同的方式! :) – Jivings 2012-01-12 20:13:13

1

我在比賽很晚,但這可能會幫助其他人。 我用$ .get創建了同樣的問題,我不想盲目關閉緩存,也不喜歡時間戳補丁。 因此經過一些研究,我發現你可以簡單地使用$ .post而不是$ .get,它不使用緩存。就那麼簡單。 :)

+0

我也遲到了:)感謝您的貢獻,它工作正常 – 2015-09-03 09:23:52

+0

這是一個不好的建議,因爲GET和POST是不同的動詞,應該用於不同的事情。相同的服務器URL可能會按動詞過濾,例如,如果服務器只需要GET,POST將不起作用。或者更糟的是,服務器可能對GET和POST有不同的行爲(實際上這很常見)。 – Andrew 2018-01-07 08:53:59

2

集緩存:在jQuery.get通話假使用下面的方法

使用新Date().getTime(),這將避免衝突,除非你有多個請求在同一毫秒內發生。

或者

下面將阻止今後所有的AJAX請求被緩存,無論哪個jQuery的方法的使用(。獲得$,$就等)

$.ajaxSetup({ cache: false }); 
1

注該回調的語法是deprecated

取消通知

jQuery 1.5中引入的jqXHR.success(),jqXHR.error()和jqXHR.complete()回調 從jQuery 1.8開始不推薦使用。若要 爲您的代碼準備好最終刪除代碼,請改用jqXHR.done(), jqXHR.fail()和jqXHR.always()代替。

這裏使用promise接口

$.ajax({url: "...", cache: false}).done(function(data) { 
    // data contains result 
}).fail(function(err){ 
    // error 
});