Jquery ajaxrequest xhr.状态代码为0,但html状态代码为200

Jquery ajaxrequest xhr.status code 0 but html status code 200

本文关键字:代码 状态 html ajaxrequest Jquery xhr      更新时间:2023-09-26

这不是一个跨站点请求问题,因为大多数谷歌搜索的问题答案都包括。

当我试图用jquery函数.get和.load发出ajax请求时,我得到了xhr.status0 och xhr.sstatusText"error"。不过,在Firebug中,请求的页面加载了html状态代码200,我可以读取响应中的文本,响应头看起来不错。

我的代码:

  function GetProjectTask(e) {
    var loader = $('#' + e + 'tasks div.loader');
    var content = $('#' + e + 'tasks div.content');
    var img = $('#' + e + 'tasks img.collapseimg');
    if (loader.html() == null || loader.html().trim() == '') {
        if (content.html() == null || content.html() == '') {
            img.attr('src', 'images/expanded.gif');
            loader.html('<img src="images/loading.gif" alt="Wait..."> Loading support tasks');
            content.load('includes/my' + e + 'tasks.php',
                function (response, status, xhr) {
                    if (status == "error") {
                        var msg = "Sorry but there was an error: ";
                        alert(msg + xhr.status + " - " + xhr.statusText);
                    }
                }
            );
            return;
        }
    }
    content.empty();
    loader.empty();
    img.attr('src', 'images/collapsed.gif');
  } 

服务器:IIS v.7.5Jquery:v1.6.2

有什么想法吗?

我相信零的状态代码可能意味着很多事情。在我的情况下,由于用户在请求-响应周期完成之前离开了页面,我收到的状态代码为零。如果与服务器的通信失败,您还可以获得零状态代码。我基本上将其概括为来自发送方的界外通信失败。这就是为什么它也会提出跨站点请求和其他与客户端打交道的原因。

W3 XMLHttpRequest规范第4.8.1节规定:

status属性必须返回运行以下步骤的结果:
如果状态为UNSENT或OPENED,则返回0并终止这些步骤
如果设置了错误标志,则返回0并终止这些步骤
返回HTTP状态代码。

如果我正确阅读了规范,那么UNSENT和OPENED是请求在发送之前可以处于的状态。如果:,则设置错误标志

错误标志表示某种类型的网络错误或请求中止。。。

我对这个状态代码的问题是,如果用户放弃了导航请求,我不认为这是错误情况,因为这是用户故意的行为。网络问题我确实认为是一个错误。例如,如果用户调用一个导致ajax请求的操作,该请求具有一个错误处理程序,用于将它们重定向到错误页面。如果用户要离开当前页面,从而中止请求,从可用性的角度来看,将他们重定向到错误页面是没有意义的。规范的实现很好,只是我还没有确定一种方法来知道零状态代码来自一个中止的请求或其他原因。如果我能够确定差异,我就能够采取适当的行动。

编辑:2014年3月18日

针对@ariera在2013年8月9日的评论,我提供了解决方法的大致描述。然而,问题是,我已经有一段时间没有解决这个问题了,我的记忆很模糊。

如果我没有记错的话,关于确定0的状态代码是否是由于用户间接中止请求引起的,我们的想法是将错误处理代码放在其自己的回调中,与错误回调分开。然后在错误回调中,检查状态代码是否为零。如果是,请在超时延迟中调用错误回调,否则调用错误回调。这里的想法是,如果错误代码为零,那么在处理错误时延迟一段时间,浏览器就可以实际执行导航。允许浏览器执行导航应该会清除任何正在执行的JavaScript,因此错误处理程序不会启动。

现在这是一个拼凑,甚至可能不会再次奏效,我真的不记得问题的复杂性了,但希望它能引导其他人走上正确的道路。

响应状态代码0是由从本地服务器提供的页面向localhost上的同一服务器发出xhr请求引起的(在我开发网站时)。

其他原因(可能的解决方案)可以在这里找到:

"确保您正在使用AJAX请求的相对URL。"-无效的HTTP响应代码"0"