【发布时间】:2011-10-23 05:51:12
【问题描述】:
在一个 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 }));
});
【问题讨论】:
-
看起来这是bugs.jquery.com/ticket/9757中解释的预期行为