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

moi*_*ran 4 javascript ajax jquery 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');
  } 
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

loe*_*sak 9

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

W3 XMLHttpRequest规范第4.8.1节规定:

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

如果我正确地读取了规范,则UNSENT和OPENED是请求在发送之前可以处于的状态.并在以下情况下设置错误标志:

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

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

编辑:03/18/2014

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

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

现在这是一个kludge,甚至可能不再工作,我真的不记得问题的复杂性,但希望它导致其他人走正确的道路.

  • 在对此工作了大约8个小时之后,我能够找到一种方法(kludge)来确定连接是否中止,或者状态代码0是否是由其他一些故障引起的.我正在使用jQuery 1.4.x,在查看了它们的源代码和XMLHttpRequest规范之后,我不得不说我认为jQuery实现对于向开发人员提供所有必要的反馈非常差.希望在未来的版本中已经修复了.如果您对我的实施感到好奇,请告诉我. (2认同)

WTK*_*WTK 3

响应状态代码 0 是通过从本地服务器提供的页面向本地主机上的同一服务器发出 xhr 请求而引起的(在我的情况下,当我开发网站时)。

\n\n

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

\n\n

“确保您对 AJAX 请求使用相对 URL。” - \n无效的 HTTP 响应代码 \xe2\x80\x980\xe2\x80\x99

\n