【问题标题】:How to check if any AJAX request is running on page via JQuery?如何通过 JQuery 检查页面上是否正在运行任何 AJAX 请求?
【发布时间】:2019-09-05 23:14:20
【问题描述】:

有什么方法可以找到页面上正在运行的任何 AJAX 请求(在 $(window).load 事件上)?

我想在所有 ajax 请求完成后应用一些事件。

我试过了

.ajaxStop(function(){ })

但是当页面上存在 AJAX 请求时,我想放置这个块(ajaxstop)。

任何帮助将不胜感激。

【问题讨论】:

  • 您可以在第一个 AJAX 请求开始时使用.ajaxStart() 调用函数。这可以添加.ajaxStop() 处理程序。
  • @Barmar:只有当有任何 ajax 请求时,我才需要应用 ajaxstart,如果页面上没有 ajax 请求,我不想执行此代码。
  • 当有 ajax 请求时,我认为您需要申请 ajaxStopajaxStart会告诉你AJAX请求何时开始,这样你就知道有AJAX请求了。
  • @Barmar:是的,但如果页面没有任何 ajax 请求,我不想申请 ajaxStart
  • 也许 jQuery deferred when 会有用 https://api.jquery.com/jQuery.when/

标签: javascript jquery ajax


【解决方案1】:

把这个放在开头:

var ajax_running = false;
$(document).ajaxStart(function() {
  ajax_running = true;
});

然后你可以稍后使用:

$(document).ready(function() {
  if (ajax_running) {
    $(document).ajaxStop(function() {
      // do something
    })
    ajax_running = false;
  }
});

【讨论】:

    【解决方案2】:

    您可以这样做,它会创建一个函数来告诉您有多少活动请求处于待处理状态。

    const activeAjaxRequests = (function(send) {
        var active_requests = 0;
        XMLHttpRequest.prototype.send = function(body) {
            active_requests++;
            this.addEventListener("readystatechange", function() {
                if(this.readyState === 4) active_requests--;
            });
            send.call(this, body);
        };
        return ()=>active_requests;
    })(XMLHttpRequest.prototype.send);
    
    var active_requests = activeAjaxRequests();
    
    console.log(`There are currently ${active_requests} active ajax requests.`);

    【讨论】:

    • 它总是返回 0 个请求
    • @SunilKumar - 那是因为当你运行它时总是有零个请求......尝试在 ajax 请求期间在你自己的页面上运行它..
    【解决方案3】:

    确保这个函数是加载到浏览器的第一件事:

    (function(open) {
    
        XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
    
            this.addEventListener("readystatechange", function() {
                //Put your code here
            }, false);
    
            open.call(this, method, url, async, user, pass);
        };
    
    })(XMLHttpRequest.prototype.open);
    

    每次检索 ajax 响应时,都会调用以下侦听器函数,并在其中放置您的代码:

    this.addEventListener("readystatechange", function() {
        //Put your code
    }, false);
    

    注意: 这段代码是从 this answer 中提取的,它用于拦截所有 ajax 请求,而从 this answer 中你不需要在函数上传递参数:

    (function(open) {
        XMLHttpRequest.prototype.open = function() {
            this.addEventListener("readystatechange", function() {
                // put your code here!
            }, false);
            open.apply(this, arguments);
        };
    })(XMLHttpRequest.prototype.open);
    

    【讨论】:

    • 我将如何从您的代码检查页面上运行的 Ajax 请求,我的意思是您的代码将返回什么?
    • 我真的需要传递参数,即方法、url、异步等吗?
    • @SunilKumar 我不太理解你的问题。我的代码不会返回任何内容。您只需要确保在发出 ajax 请求的任何代码之前加载此代码。然后,对于 ajax 请求的每个响应,将调用侦听器“readystatechange”,并在侦听器函数中放置您想要做的任何地方。
    • @SunilKumar 我对我的代码进行了一些更改,以便您查看!我很好地回答了你的疑问
    • 如果页面上没有ajax请求,那么将执行哪个代码块?
    猜你喜欢
    • 2012-05-21
    • 2014-11-05
    • 2013-01-21
    • 1970-01-01
    • 2011-05-17
    • 2021-06-25
    • 2017-07-21
    • 2016-01-20
    相关资源
    最近更新 更多