jQuery: $.ajaxSetup(beforeSend)和$(document).ajaxSend有什么区别?

4
使用 jQuery (v2.1.4),这两种方法有什么区别吗?
1) $.ajaxSetup(beforeSend)
$.ajaxSetup({
  beforeSend: function (jqXHR, settings) {
    // whatever you need to do before
    // any jQuery Ajax request is sent
  }
});

2) $(document).ajaxSend}
(注:这是一段代码,无法直接翻译为自然语言。)
$(document).ajaxSend(function (event, jqXHR, settings) {
  // whatever you need to do before
  // any jQuery Ajax request is sent
});

有什么理由偏好其中一个?谢谢!
3个回答

2
从 jQuery $.ajaxSetup() 文档中翻译:

除非被单独调用的 Ajax 函数覆盖,否则所有使用任何函数的后续 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-"打开")。
这意味着,如果使用global选项将$.ajax()调用设置为false,则ajaxSend()方法将不会触发。
而在$.ajaxSetup()中,实际上为每个jQuery Ajax调用的设置创建了默认值,并且通过beforeSend选项定义的回调将始终被调用(XMLHttpRequest.readyState值为0-"未初始化")。

@Andreas 当我说它会覆盖默认设置时,这种含义有点隐含。已经编辑过以更加清晰明了。谢谢。 - Joel Almeida
回调函数 x 将在回调函数 y 之前执行。 - Joel Almeida
1
好的,听起来我们有了一个很好的答案!在接受之前,我会添加一个编辑,包括@RohitKumar回答中提到的global选项,这是一个相关的观点。感谢大家的帮助! - Pensierinmusica
@JoelAlmeida 实际上我刚刚注意到你的回答中有一个矛盾之处:对于 $.ajaxSetup,你首先引用了 jQuery 文档中的“除非被单个调用覆盖”,然后又说“它将覆盖设置”。我检查了一下:第一种说法是正确的,而第二种说法是错误的。我会在编辑中纠正这一点。 - Pensierinmusica
@Pensierinmusica 是的。我有一点困惑。 - Joel Almeida
显示剩余2条评论

0

两者都具有非常相似的功能,但它总是取决于需求。

  1. ajaxSend()方法必须仅附加到文档。
  2. 如果调用$.ajax()时将全局选项设置为false,则ajaxSend()方法将不会触发。
  3. beforeSend选项将在任何类型的请求中被调用。

从优先级的角度来看,您可以这样使用,在ajaxSend中执行所有设置选项,并在$.ajax()中针对自定义或特定的ajax请求使用beforeSend进行覆盖。

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

现场直播 http://jsfiddle.net/mailmerohit5/w8t44247/


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,
    // ...
});

了解更多信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接