2011-08-09 30 views
20

在我加入使用ajaxSetup一些默認數據的Ajax驅動的網站,鼻翼這樣的:jQuery的ajaxSetup - 我想補充的默認數據GET請求僅

var revision = '159'; 
$.ajaxSetup({ 
    dataType: "text json", 
    contentType: "application/x-www-form-urlencoded; charset=UTF-8", 
    data: { 
     r: revision 
    } 
}); 

這是爲了確保緩存缺失當部署新版本並且前端從後端請求html模板或json-data時。由於這個原因,後端和前端共享相同的版本號。

問題是,當前端執行PUT,POST或DELETE時,後端對獲取參數'r'有些不滿意。有沒有辦法告訴jQuery的ajax,這個數據只應該在做GET請求時使用,而不是在執行POST,PUT或DELETE請求時使用。

UPDATE:

我第一次嘗試了beforeSend功能,因爲我知道這一點。不過,更改settings.data是可能的,但beforeSend返回時,任何更改都會消失。這可能是我的錯...... :-)

我已經在ajaxPreFilter上解決了。儘管如此,這並不容易。 options.data不是一個對象,而是$ .param(object)的結果,所以第一個挑戰是對它進行非參數化。我結束了與此:

var revision = '159'; 
$.ajaxPrefilter(function (options, originalOptions, jqXHR) { 
    // do not send data for POST/PUT/DELETE 
    if (originalOptions.type !== 'GET' || options.type !== 'GET') { 
     return; 
    } 

    var data = originalOptions.data; 
    if (originalOptions.data !== undefined) { 
     if (Object.prototype.toString.call(originalOptions.data) === '[object String]') { 
      data = $.deparam(originalOptions.data); // see http://benalman.com/code/projects/jquery-bbq/examples/deparam/ 
     } 
    } else { 
     data = {}; 
    } 

    options.data = $.param($.extend(data, { r: revision })); 
}); 
+0

看起來它是在http://bugs.jquery.com/ticket/9757 – Ritesh

回答

29

開始的jQuery 1.5,你可以通過Prefilters更優雅的處理這個問題:

var revision = '159'; 
$.ajaxPrefilter(function (options, originalOptions, jqXHR) { 
    // do not send data for POST/PUT/DELETE 
    if(originalOptions.type !== 'GET' || options.type !== 'GET') { 
     return; 
    } 

    options.data = $.extend(originalOptions.data, { r: revision }); 
}); 
+8

我使用jQuery 1.6.4,我只能讓它像這樣工作:options.data = $ .param($。extend(originalOptions.data,{r :revision})); –

+1

@MorganCheng:檢查你是否設置了正確的'contentType'和'processData'標誌。 jQeury會做相應的序列化。如果你的數據是一個數組,你可能想要檢查'傳統'設置。 – Mrchief

+0

您的最後一行有一個尾隨逗號。 –

10

我認爲你可能能夠使用的是beforeSend

var revision = '159'; 
$.ajaxSetup({ 
    dataType: "json", 
    contentType: "application/x-www-form-urlencoded; charset=UTF-8", 
    beforeSend: function(jqXHR, settings) { 
     if(settings.type == "GET") 
      settings.data = $.extend(settings.data, { ... }); 
     return true; 
    } 
}); 

jqXHR documentation

BeforeSend documentation as well as your settings available

我編寫這種盲目的,所以我希望它可以讓你在正確的方向前進。

+1

解釋什麼是預期的行爲$ .ajaxPrefilter和beforeSend之間的區別? – svlada

+0

@svlada'$ .ajaxSetup()' - 爲將來的Ajax請求設置默認值。 '.ajaxPrefilter()' - 在發送每個請求之前修改現有的選項。 http://stackoverflow.com/a/29843893/2714931 – WeizhongTu