当前位置: 首页 > 面试题库 >

如何在每个ajax调用之前和之后触发某些操作

濮阳赞
2023-03-14
问题内容

我正在使用jQuery和jQuery
UI。我体验到用户有时会多次触发ajax调用,因为触发调用的按钮/链接在单击后不会立即被禁用。为了防止这种情况的发生,现在我在“
beforeSend”操作中禁用按钮/链接。

这是典型的Ajax Call对我来说的样子:

   $.ajax({
      type: "POST",
      url: "someURL"
      data: "someDataString",
      beforeSend: function(msg){
        $(".button").button("disable");
      },
      success: function(msg){
        $(".button").button("enable");
        // some user Feedback
      }
    });

但是我不想在每个Ajax调用中添加此按钮禁用逻辑。有什么办法全局定义每次在/ after和ajax-call之前都会被调用的函数吗?


问题答案:

有几种方法可以实现您的要求。它们之间的唯一区别是它们的实现方式,由您选择哪种方法最适合您的特定情况。方法还取决于您使用的jQuery版本,因此我将把答案分为两部分。

对于jQuery 1.5及更高版本

初始化后添加多个回调

从jQuery
1.5开始,您可以通过全面改进的API和引入的新jqXHR对象添加多个回调.ajax。它实现Promise(请参见Deferreds)接口,我们可以利用它来发挥我们的优势:

// fn to handle button-toggling
var toggleButton = function() {
    var button = $(".button");
    button.button(button.button("option", "disabled") ? "enable" : "disable");
}

// store returned jqXHR object in a var so we can reference to it
var req = $.ajax({
    beforeSend: toggleButton,
    success: function(msg){
        /* Do what you want */
    }
}).success(toggleButton);

// we can add even more callbacks
req.success(function(){ ... });

使用预过滤器

jQuery 1.5还引入了预过滤器,可用于替换jQuery
1.4的全局配置:

// good practice: don't repeat yourself, especially selectors
var button = $(".button");

$.ajaxPrefilter(function(options, _, jqXHR) {
    button.button("disable");
    jqXHR.complete(function() {
        button.button("enable");
    });
});

注意:$
.ajax条目的jqXHR部分具有有关使用的通知jqXHR.success()

弃用通知:从jQuery
1.8开始,不再使用jqXHR.success(),jqXHR.error()和jqXHR.complete()回调。要准备将其最终删除的代码,请改用jqXHR.done(),jqXHR.fail()和jqXHR.always()。

对于jQuery 1.4及更早版本

事件和全局配置

使用.ajaxStart.ajaxStop将回调绑定到特定选择器。触发这些回调的事件将在所有Ajax请求上触发。

$(".button").ajaxStart(function(){
    $(this).button("disable");
}).ajaxStop(function(){
    $(this).button("enable");
});

使用.ajaxSetup设置一个全局AJAX配置。设置对象传递给.ajaxSetup将被应用到所有的Ajax请求,即使那些由速记制造.get.getJSON.post。请注意,不建议这样做,因为它很容易破坏其功能。

$.ajaxSetup({
    beforeSend: function(){
        $(".button").button("disable");
    },
    success: function(){
        $(".button").button("enable");
    }
});

过滤全局事件回调中的请求

如果您需要过滤某些请求,则可以使用,.ajaxSend.ajaxComplete在哪里可以检查Ajax
settings对象。像这样:

var button = $(".button");

// fn to handle filtering and button-toggling
var toggleButton = function(settings) {
    if (settings.url == "/specific/url")
        button.button(button.button("option", "disabled") ?
            "enable" : "disable");
    }
};

// bind handlers to the callbacks
button.ajaxSend(function(e,x,settings){
    toggleButton(settings);
}).ajaxComplete(function(e,x,settings){
    toggleButton(settings);
});

通过对传递给回调处理程序.ajaxSetupsettings对象进行相同类型的检查,也可以使用前面提到的方法来完成。



 类似资料:
  • 问题内容: 我有一个测试套件,可以在其中退出系统并在中关闭浏览器。我尝试使用每种测试方法都使用Selenium拍摄失败的测试屏幕截图。我手动检查了它只在每个之前运行,但我想在它之前和之后进行设置。我找不到简单的解决方案。任何帮助将不胜感激。 我得到的输出是 问题答案: 由于规则的设置方式,因此不能有@before之后或@after之后的规则。您可以想到放在测试方法上的诸如shell之类的规则。要进

  • 问题内容: 嗨,下面的Javascript是在我提交表单时调用的。它首先从文本区域分割一堆网址,然后: 1)在表格中为每个网址添加行,并在最后一列(“状态”列)中显示“未开始”。 2)再次循环遍历每个URL,首先它进行ajax调用以检查状态(status.php),该状态将返回0到100之间的百分比 。3)在同一循环中,它通过ajax启动实际过程(process.php),当进程完成时(请记住连续

  • 我想我错过了一些关于之前和之前的方式。我有一个规范文件,加载数据从夹具在之前的方法。这些数据中的一部分被用在之前的函数中,然后又被用在之前的函数中,以及在实际的测试中。规范文件包含2个测试。第一个测试按预期执行。第二个失败,因为beForeeach表示来自夹具的值之一未定义。 我的期望是,如果我加载数据从一个夹具在之前的方法,它应该是可用于所有测试规范文件。 在执行“检查按钮栏的状态”时,测试be

  • 我有15节6月5日的课要考试。当我从maven运行它们时,afterAll()被执行了15次,这导致了15次对Slack Webhook的通知。还有什么我需要只发送一个通知吗?

  • 问题内容: 这是我的代码,也许您会立即注意到我所缺少的内容: 我正在尝试在CustomerId现有节点之前插入新的node()。这是我的XML示例文件: 这是一个抛出异常,我只是不知道还能尝试什么: NOT_FOUND_ERR:尝试在不存在的上下文中引用该节点。 问题答案: 在这里,我只是使用您提供的xml示例进行了测试的示例。 结果如下: 如果您有兴趣,这是我用来显示结果的示例代码:

  • 我有一个测试方法,看起来像: 并行工作使用可关闭的资源来控制生命周期,该资源在方法中关闭: 问题是:方法是在完成工作之前和等待超时到期之前调用的。 怎么可能?那我该怎么解决呢?