jQuery的ajaxSetup – 我想仅为GET请求添加默认数据

在ajax驱动的站点中,我使用ajaxSetup添加了一些默认数据,ala:

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

这是为了确保在部署新修订时前端缓存未命中,并且前端从后端请求html模板或json数据。 由于这个原因,后端和前端共享相同的修订号。

问题是后端在前端执行PUT,POST或DELETE时获取参数’r’有点不高兴。 有没有办法告诉jQuery的ajax这个数据只应该在执行GET请求时使用,而不是在执行POST,PUT或DELETE请求时使用。

更新:

我首先尝试了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 })); }); 

启动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 }); }); 

我认为你可以使用的是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文档

BeforeSend文档以及您的设置可用

我把这个盲目编码,所以我希望它会让你朝着正确的方向前进。