在ajax驱动的站点中,我使用ajaxSetup添加了一些默认数据,如下:
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请求时则不应该使用此数据。
更新:
因为我知道,所以我首先尝试了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 }); });