使用jQuery(v2.1.4),这两种方法有什么区别吗?
$.ajaxSetup({
beforeSend: function (jqXHR, settings) {
// whatever you need to do before
// any jQuery Ajax request is sent
}
});
$(document).ajaxSend(function (event, jqXHR, settings) {
// whatever you need to do before
// any jQuery Ajax request is sent
});
有没有理由更喜欢一个而不是另一个?
谢谢!
答案 0 :(得分:2)
来自jQuery $.ajaxSetup()
文档:
使用任何函数的所有后续Ajax调用都将使用新设置,除非被单个调用覆盖,直到下一次调用$ .ajaxSetup()。
$.ajaxSetup()
做了类似的事情:
ajaxExtend(jQuery.ajaxSettings, target);
来自$.ajaxSend()
文档:
每当要发送Ajax请求时,jQuery都会触发ajaxSend事件。已经使用.ajaxSend()方法注册的任何和所有处理程序都会在此时执行。
$.ajaxSend()
的jQuery源代码:
function (fn) {
return this.on(type, fn);
}
因此,基本上$(document).ajaxSend()
为所有文档添加了一个事件监听器,您可以在任何时候发送jQuery Ajax调用时执行任何处理程序(处理程序拦截它,但是XMLHttpRequest.readyState
值已经1
- "已打开")。
这意味着如果在$.ajax()
选项设置为global
的情况下调用false
,则ajaxSend()
方法将不会触发。
在$.ajaxSetup()
上,您实际上为每个jQuery Ajax调用设置创建默认值,并且始终会调用通过beforeSend
选项定义的回调({{1} } value是XMLHttpRequest.readyState
- " Unsent")。
答案 1 :(得分:0)
两者都有非常相似的功能,但它总是取决于需要 您可以关注一些关键点
$.ajax()
,则ajaxSend()
方法将不会触发。beforeSend
选项。从优先级的角度来看,您可以通过这种方式使用ajaxSend
中的所有设置选项以及自定义或特定的ajax请求,使用beforeSend
中的$.ajax()
覆盖它。< / p>
<强> HTML 强>
<body>
<div><h2>Let AJAX change this text</h2></div>
<button id="btn1">Change Content</button>
<button id="btn2">Change Content Override</button>
</body>
JS
$(document).ajaxSend(function(e, xhr, opt){
$("div").append("<p>Requesting " + opt.url + "</p>");
});
$("#btn1").click(function(){
$("div").load("yourpage.html");
});
$("#btn2").click(function(){
$.ajax({
global: false,
beforeSend:function(){$("div").append("<p>Overriding</p>");}
});
$("div").load("yourpage.html");
});
答案 2 :(得分:0)
来自JQuery的文档:
有两种类型的事件:
本地活动 这些是您可以在Ajax请求中订阅的回调 对象,如:
$.ajax({
beforeSend: function(){
// Handle the beforeSend event
},
complete: function(){
// Handle the complete event
}
// ......
});
全球活动
这些事件在文档上触发,调用任何处理程序 可能在听。您可以像这样监听这些事件:
$(document).bind("ajaxSend", function(){
$("#loading").show();
}).bind("ajaxComplete", function(){
$("#loading").hide();
});
可以通过传入全局选项来禁用特定Ajax请求的全局事件,如下所示:
$.ajax({
url: "test.html",
global: false,
// ...
});