检查待处理的 AJAX 请求或 HTTP GET/POST 请求

Posted

技术标签:

【中文标题】检查待处理的 AJAX 请求或 HTTP GET/POST 请求【英文标题】:Check Pending AJAX requests or HTTP GET/POST request 【发布时间】:2011-03-16 19:17:00 【问题描述】:

如何检查页面是否有待处理的 AJAX 或 HTTP GET/POST 请求?我使用 javascript 和/或 python 进行此检查。

如果页面已完成所有请求,我想做的是执行脚本。 onload 对我不起作用,如果您使用 firebugs 网络面板,您就会知道。 onload 在页面加载时触发,但仍有可能在某处挂起待处理的请求。

提前谢谢你。

【问题讨论】:

【参考方案1】:

我可以确认 document.readyState 仍然可以“完成”,即使网络选项卡中有待处理的请求。

我现在开发的用于检查页面是否已完全加载的代码是:

var prevSize= document.body.innerhtml.length;
var id= setInterval(()=>
    let currSize=document.body.innerHTML.length;
    if(prevSize===currSize)
          clearInterval(id);
          console.log("page loaded successfully");
        
     else
          console.log("loading...");
          prevSize=currSize;
        
, 3000)

每 3 秒检查一次 document.body.innerHTML 长度。 不是最好的解决方案,但至少可行。

【讨论】:

【参考方案2】:
document.addEventListener("readystatechange", function(event) 
    if (document.readyState === "complete") 
        console.log("complete");
    
);

【讨论】:

【参考方案3】:

这是最好的检查方法。

var loadingDone =  document.readyState=="complete" && jQuery.active === 0;

因此,如果 Ajax 调用完成,loadingDone 将为真。如果它是假的,那么你可以添加等待。

【讨论】:

ja,它是正确的。我对硒测试做同样的事情【参考方案4】:

我看到你提到你正在使用 Prototype.js。您可以通过检查 Ajax.activeRequestCount 值来使用 Prototype 跟踪活动请求。您可以使用 setTimeout 或 setInterval 进行检查,以确保在页面加载时触发的任何请求都已完成(如果这是您要执行的操作)

【讨论】:

这个也不错,但只检查 AJAX 请求。 http get/post 请求怎么样? (使用 iframe 发生)【参考方案5】:

我想您想知道 HTML 是否已完全加载。在这种情况下,您可以使用dom:loaded 事件。这是一个关于如何将它与原型一起使用的示例(但必须有其他 JS 框架的变体):

document.observe("dom:loaded", function() 
  // do whatever you want to do
);

一旦加载了 DOM 树,就会触发此事件。所以即使在所有图像或外部数据(包括 iframe)都被加载之前。

【讨论】:

【参考方案6】:

想通了。感谢你们的努力。 只是简单的javascript。

interValRef = 0;

interValRef = setInterval("checkState();",100)

function checkState()
    if(document.readyState == 'complete')
        clearInterval(interValRef);
        myFunc();
    

【讨论】:

我想要的只是检查页面是否已完全加载。没有待处理的 http get/post ajax 请求。上面的代码成功了。 我很确定在 readyState 变为“完成”后仍有待处理的 HTTP 请求。 load 事件与 readyState 相对应,它仅表示初始请求已加载其所有依赖项(而不是不再挂起的请求)。您可以在 yahoo.com 等页面上的 Chrome 网络标签中看到这一点。红线是load 事件,但之后通常会有未决的事情发生。【参考方案7】:

假设您使用的是prototype.js,您可以跟踪所有请求对象的计数器

var ACTIVE_REQUESTS = 0; // GLOBAL

ACTIVE_REQUESTS++
new Ajax.Request('/your/url', 
  onSuccess: function(response) 
    ACTIVE_REQUESTS--;
    // Handle the response content...
  
));

console.log("there are " + ACTIVE_REQUESTS + " open AJAX requests pending");

【讨论】:

【参考方案8】:

您需要跟踪每个 XMLHttpRequest 并监控它是否完成或异步回调是否被执行。

【讨论】:

对 HTML GET/POST 请求有什么建议吗?如果 IFRAME 在页面中,就会发生这种情况。

以上是关于检查待处理的 AJAX 请求或 HTTP GET/POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

jQuery AJAX GET/POST 请求在错误处理程序中返回 404,但从服务器发送了有效响应

使用 jQuery 中止待处理/积压的 AJAX 请求

jQuery – AJAX get() 和 post() 方法

jQuery:我可以在较长的 $.ajax 请求待处理时发送和接收 $.ajax 响应吗?

$ajax默认以啥方式请求数据

Laravel - 检查 Ajax 是不是请求