在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 }));
});
答案 0 :(得分:31)
启动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 });
});
答案 1 :(得分:11)
我认为您可以使用的是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;
}
});
BeforeSend documentation as well as your settings available
我把这个盲目编码,所以我希望它能让你朝着正确的方向前进。