Javascript jqueryajax在发送`$.ajaxSetup`之前,如何级联它?

Javascript jqueryajax在发送`$.ajaxSetup`之前,如何级联它?,javascript,jquery,ajax,xmlhttprequest,django-rest-framework,Javascript,Jquery,Ajax,Xmlhttprequest,Django Rest Framework,我正在使用django rest框架 在每次jqueryajax发送之前,我必须添加X-CSRFToken头 参考: 因此,在使用beforeSend设置进行ajax调用之前,一切都很好: jQuery.ajax({ url: '...', data: { ... }, beforeSend: function(xhr, settings) { // This function do shadows the ajaxSetup one. } });

我正在使用django rest框架

在每次jqueryajax发送之前,我必须添加
X-CSRFToken

参考:

因此,在使用beforeSend设置进行ajax调用之前,一切都很好:

jQuery.ajax({
    url: '...',
    data: { ... },
    beforeSend: function(xhr, settings) {
        // This function do shadows the ajaxSetup one.
    }
});

那么,在
jQuery.ajaxSetup
调用上是否有任何有效的方法来级联beforeSend处理器?

如果在
$中定义一个新的
beforeSend
注入。ajaxSetup
,我可以级联前面
$中定义的其他处理器。ajaxSetup

(function() {
    function csrfSafeMethod(method) {
        // these HTTP methods do not require CSRF protection
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    var originBeforeSend = jQuery.ajaxSettings.beforeSend;
    jQuery.ajaxSetup({
        beforeSend: function(xhr, settings) {
            // Call the previous beforeSend processor first.
            if(originBeforeSend && originBeforeSend(xhr, settings) === false) {
                return false;
            }
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", Cookies.get('csrftoken'));
            }
        }
    });
})();

但无论如何,如果我在
$.ajax()
调用中指定了另一个
beforeSend
,这种方法就不太走运了。实际上,在的jQuery文档中,从
$设置发送前的
。ajax
调用或
$。ajaxSetup
称为本地事件,但在当前情况下,使用
$(文档)。ajaxSend()
称为全局事件更合适


最终解决方案 如果要在ajax send上添加多个全局事件处理器,请不要将其设置为
$.ajaxSetup

改用
ajaxSend
事件!
http://api.jquery.com/ajaxSend/

因此,代码可能如下所示:

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$(document).ajaxSend(function(event, xhr, settings) {
    if (!csrfSafeMethod(settings.type) && !settings.crossDomain) {
        xhr.setRequestHeader("X-CSRFToken", Cookies.get('csrftoken'));
    }
});
function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$(document).ajaxSend(function(event, xhr, settings) {
    if (!csrfSafeMethod(settings.type) && !settings.crossDomain) {
        xhr.setRequestHeader("X-CSRFToken", Cookies.get('csrftoken'));
    }
});