javascript – Jquery ajaxrequest xhr.status代码0但是html状态代码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

有任何想法吗?

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

W3 XMLHttpRequest specification section 4.8.1声明:

The status attribute must return the result of running these steps:
If the state is UNSENT or OPENED, return 0 and terminate these steps.
If the error flag is set, return 0 and terminate these steps.
Return the HTTP status code.

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

The error flag indicates some type of network error or request abortion …

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

编辑:03/18/2014

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

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

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

转载注明原文:javascript – Jquery ajaxrequest xhr.status代码0但是html状态代码200 - 代码日志