Javascript jqueryajax在发送`$.ajaxSetup`之前,如何级联它?
我正在使用django rest框架 在每次jqueryajax发送之前,我必须添加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. } });
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'));
}
});