260

在下面的代码中,我要做的就是从 jQuery.ajax 调用中获取 HTTP 响应代码。然后,如果代码是 301(永久移动),则显示“位置”响应标头:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>jQuery 301 Trial</title>
  <script src="http://code.jquery.com/jquery-1.5.1.min.js"></script>

  <script type="text/javascript">
  function get_resp_status(url) {
    $.ajax({
      url: url,
      complete: function (jqxhr, txt_status) {
        console.log ("Complete: [ " + txt_status + " ] " + jqxhr);
        // if (response code is 301) {
        console.log ("Location: " + jqxhr.getResponseHeader("Location"));
        // }
      }
    });
  }
  </script>
  <script type="text/javascript">
  $(document).ready(function(){
    $('a').mouseenter(
      function () {
        get_resp_status(this.href);
      },
      function () {
      }
    );
  });
  </script>
</head>
<body>
  <a href="http://ow.ly/4etPl">Test 301 redirect</a>
  <a href="http://cnn.com/not_found">Test 404 not found</a>
</body>
</html>

有人可以指出我哪里出错了吗?当我在 Firebug 中检查“jqxhr”对象时,找不到状态代码,也找不到“Location”响应标头。我在“完成”的最后一行设置断点。

非常感谢。

4

7 回答 7

249

我在 jqXhr 对象上看到了状态字段,这是它的工作原理:

http://jsfiddle.net/magicaj/55HQq/3/

$.ajax({
    //...        
    success: function(data, textStatus, xhr) {
        console.log(xhr.status);
    },
    complete: function(xhr, textStatus) {
        console.log(xhr.status);
    } 
});
于 2011-03-17T19:30:54.420 回答
56

我自己遇到了这个寻找类似解决方案的旧线程,并发现接受的答案是.complete()使用jquery ajax. 我在这里引用jquery 网站上的通知:

jqXHR.success ()、jqXHR.error() 和 jqXHR.complete()回调从 jQuery 1.8 开始被弃用。要为最终删除准备代码,请改用jqXHR.done()、jqXHR.fail() 和 jqXHR.always()

要了解status codeajax 响应,可以使用以下代码:

$.ajax( url [, settings ] )
.always(function (jqXHR) {
    console.log(jqXHR.status);
});

适用于.done().fail()

于 2013-07-02T21:39:21.813 回答
55

使用传递给 $.ajax 函数的参数对象的 statusCode 属性可能更惯用 jQuery:

$.ajax({
  statusCode: {
    500: function(xhr) {
      if(window.console) console.log(xhr.responseText);
    }
  }
});

但是,正如利文斯顿塞缪尔所说,不可能在 javascript 中捕获 301 状态代码。

于 2012-08-02T13:16:09.350 回答
43

当您的 XHR 请求返回重定向响应(HTTP 状态 301、302、303、307)时,将XMLHttpRequest 自动跟随重定向的 URL 并返回该 URL 的状态代码

status您可以通过xhr 对象的属性获取非重定向状态代码(200、400、500 等) 。

因此,您无法从 、 或 请求的响应标头中获取301重定向位置。302303307

您可能必须更改您的服务器逻辑以以您可以处理重定向的方式进行响应,而不是让浏览器来做。一个示例实现

于 2011-03-17T19:38:54.147 回答
29

您可以检查您的响应内容,只需 console.log 它,您将看到 whitch 属性有一个状态代码。如果不了解jsons,请参考视频:https ://www.youtube.com/watch?v=Bv_5Zv5c-Ts

它解释了非常基础的知识,让您对 javascript 感觉更舒服。

您可以使用较短版本的 ajax 请求来完成,请参见上面的代码:

$.get("example.url.com", function(data) {
                console.log(data);
            }).done(function() {
               // TO DO ON DONE
            }).fail(function(data, textStatus, xhr) {
                 //This shows status code eg. 403
                 console.log("error", data.status);
                 //This shows status message eg. Forbidden
                 console.log("STATUS: "+xhr);
            }).always(function() {
                 //TO-DO after fail/done request.
                 console.log("ended");
            });

控制台输出示例:

error 403 
STATUS: Forbidden 
ended
于 2016-10-26T08:03:30.607 回答
15

注意:使用 jQuery 3.4.1

$.ajax({
  url: URL,
  success: function(data, textStatus, jqXHR){
    console.log(textStatus + ": " + jqXHR.status);
    // do something with data
  },
  error: function(jqXHR, textStatus, errorThrown){
    console.log(textStatus + ": " + jqXHR.status + " " + errorThrown);
  }
});
于 2019-11-12T20:29:29.880 回答
4

jqxhr 是一个 json 对象:

完整返回:
jqXHR(在 jQuery 1.4.x 中,XMLHTTPRequest)对象和对请求状态进行分类的字符串(“success”、“notmodified”、“error”、“timeout”、“abort”或“parsererror”) .

参见: jQuery ajax

所以你会这样做:

jqxhr.status获取状态

于 2011-03-17T19:32:18.187 回答