Jquery ajaxrequest xhr.status代码0但是html状态代码200

时间:2012-01-12 09:00:29

标签: javascript jquery ajax http-status-code-200

这不是一个跨网站请求问题,因为我的问题的大多数Google搜索答案都包含在内。

当尝试使用jquery函数.get和.load创建ajax请求时,我得到xhr.status 0 och xhr.statusText“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.5 Jquery:v1.6.2

有什么想法吗?

2 个答案:

答案 0 :(得分:9)

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

W3 XMLHttpRequest specification section 4.8.1州:

  

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

如果我正确读取规范,UNSENT和OPENED是请求在发送之前可以处于的状态。如果出现错误标志:

  

错误标志表示某种类型的网络错误或请求堕胎......

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

编辑:2014年3月18日

在回应@ariera于2013年8月9日的评论时,我提供了解决方法的粗略描述。然而,问题是我解决了这个问题已经有一段时间了,而且我的记忆含糊不清。

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

现在这是一个kludge,甚至可能不会再次工作,我不记得问题的复杂性,但希望它能引导别人走上正确的道路。

答案 1 :(得分:3)

响应状态代码0,是由我的本地服务器提供的页面向本地服务器上的同一服务器发出xhr请求而导致(在我开发网站的情况下)。

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

“确保您为AJAX请求使用相对URL。” - invalid HTTP response code ‘0’