5

这不是跨站点请求问题,因为我的问题的大多数谷歌答案都包括在内。

尝试使用 jquery 函数 .get 和 .load 发出 ajax 请求时,我收到 xhr.status 0 och xhr.statusText“错误”。但是在 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

有任何想法吗?

4

2 回答 2

10

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

W3 XMLHttpRequest 规范第 4.8.1 节规定:

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

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

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

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

编辑:2014 年 3 月 18 日

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

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

现在这是一个混乱,甚至可能无法再次工作,我真的不记得这些问题的复杂性,但希望它能够引导其他人走上正确的道路。

于 2012-01-27T19:18:35.400 回答
3
于 2012-01-12T11:19:22.683 回答