在下面的代码中,我所要做的就是从jQuery中获取HTTP响应代码。ajax调用。然后,如果代码是301(永久移动),显示'Location'响应头:

<?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'响应头。我在“完成”的最后一行设置了断点。

谢谢。


我看到了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);
    } 
});

JQXHR是一个json对象:

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

看到的: jQuery ajax

所以你会这样做:

jqxhr。Status获取状态


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

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

因此,您无法从301、302、303或307请求的响应头中获得重定向位置。

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


使用传递给$. jQuery对象的参数对象的statusCode属性可能是更地道的jQuery。ajax功能:

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

然而,正如Livingston Samuel所说,在javascript中捕获301个状态代码是不可能的。


偶然发现这个旧线程搜索一个类似的解决方案,我发现接受的答案是使用jquery ajax的.complete()方法。我引用jquery网站上的声明:

jqXHR.success()、jqXHR.error()和jqXHR.complete()回调函数从jQuery 1.8开始已弃用。要为最终删除它们做好准备,请使用jqXHR.done()、jqXHR.fail()和jqXHR.always()。

要知道ajax响应的状态代码,可以使用以下代码:

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

工作原理类似于.done()和.fail()


你可以检查你的响应内容,只要console.log它,你会看到哪个属性有一个状态码。如果你不明白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

注意:使用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);
  }
});