小编典典

jQuery的ajaxSetup-我只想为GET请求添加默认数据

ajax

在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 }));
});

阅读 352

收藏
2020-07-26

共1个答案

小编典典

从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 });
});
2020-07-26