jQuery ajax beforeSend阴影`$ .ajaxSetup`一,如何级联呢?

时间:2015-09-26 09:18:00

标签: javascript jquery ajax xmlhttprequest django-rest-framework

我正在使用django-rest-framework。

我必须在每个jquery ajax发送之前添加X-CSRFToken标头。

参考:https://docs.djangoproject.com/en/1.8/ref/csrf/#ajax

jQuery.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", Cookies.get('csrftoken'));
        }
    }
});

所以,一切都很顺利,直到我使用beforeSend设置进行ajax调用:

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

那么,有没有有效的方法在jQuery.ajaxSetup电话上级联beforeSend处理器?

2 个答案:

答案 0 :(得分:1)

事实上,在jQuery Event的jQuery文档中,从beforeSend来电或$.ajax设置$.ajaxSetup称为本地事件 ,但在目前的情况下,使用名为全球事件$(document).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'));
    }
});

答案 1 :(得分:0)

如果在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'));
            }
        }
    });
})();

但无论如何,如果我在beforeSend电话中指定了另一个$.ajax(),这种方式就没有运气。它仍然是阴影。