Javascript jQuery:获取Ajax响应的类型

Javascript jQuery:获取Ajax响应的类型,javascript,ajax,jquery,Javascript,Ajax,Jquery,我需要发出一个Ajax请求,但其响应可能会有所不同,由服务器端决定 有没有办法知道反应是什么类型的 它可能类似于: $.post(url, pars, function (response, type) { if (type=='json') ... if (type=='html') ... }); 如果您还可以控制服务器端代码,那么最简单的方法可能是包含一个参数,该参数的值用于指定格式 这里有一个例子,我做了和你描述的一样的事情。我加载了一个表,其中包含以xml、json或

我需要发出一个Ajax请求,但其响应可能会有所不同,由服务器端决定

有没有办法知道反应是什么类型的

它可能类似于:

$.post(url, pars, function (response, type) {
    if (type=='json') ...
    if (type=='html') ...
});

如果您还可以控制服务器端代码,那么最简单的方法可能是包含一个参数,该参数的值用于指定格式

这里有一个例子,我做了和你描述的一样的事情。我加载了一个表,其中包含以xml、json或字符串格式返回的数据中的客户值,所有这些值都由作为format参数返回的服务器端代码值驱动:

function checkCusts(id, format, resultRegion) {
  var address = "cust-lookup.jsp";
  var data = "cust_id_list=" + getValue(id) + "&format=" + format;

  if (address != "") {
    ajaxPost(address, data,
    function(request) {
      parseCustomers(request, format, resultRegion);
    });
  }
}

function parseCustomers(request, format, resultRegion) {
  if ((request.readyState == 4) && (request.status == 200)) {
    var headings = new Array("Customer ID", "First Name", "Last Name", "Balance");
    var rows = null, customers = null;

    if ("xml" == format) {
      var xmlDocument = request.responseXML;
      customers = xmlDocument.getElementsByTagName("customer");
      rows = new Array(customers.length);
      var subElementNames = ["cust_id", "first_name", "last_name", "balance"];
      for (var i=0; i<customers.length; i++) {
        rows[i] = getElementValues(customers[i], subElementNames);
      }
    } else if ("json" == format) {
      var rawData = request.responseText;
      var data = eval("(" + rawData + ")");
      rows = data.customers;
    } else if ("string" == format) {
      var rawData = request.responseText;
      var rowStrings = rawData.split(/[\n\r]+/);
      rows = new Array(rowStrings.length -1);
      for (var i=1; i<rowStrings.length; i++) {
        rows[i-1] = rowStrings[i].split("#");
      }
    }

    var table = getTable(headings, rows);
    htmlInsert(resultRegion, table);
  }
}
函数检查客户(id、格式、结果区域){
var address=“cust lookup.jsp”;
var data=“cust\u id\u list=“+getValue(id)+”&format=“+format;
如果(地址!=“”){
ajaxPost(地址、数据、,
功能(请求){
解析客户(请求、格式、结果区域);
});
}
}
函数解析客户(请求、格式、结果区域){
if((request.readyState==4)和&(request.status==200)){
var标题=新数组(“客户ID”、“名”、“姓”、“余额”);
var行=null,客户=null;
如果(“xml”==格式){
var xmlDocument=request.responseXML;
customers=xmlDocument.getElementsByTagName(“客户”);
行=新数组(customers.length);
var subElementNames=[“客户id”、“名”、“姓”、“余额”];

对于(var i=0;i来说,如果您还可以控制服务器端代码,那么最简单的方法可能是包含一个参数,该参数的值用于指定格式

下面是一个示例,我执行了与您描述的相同类型的操作。我加载了一个表,其中包含以xml、json或字符串格式返回的数据中的客户值,所有这些值都由作为format参数返回的服务器端代码的值驱动:

function checkCusts(id, format, resultRegion) {
  var address = "cust-lookup.jsp";
  var data = "cust_id_list=" + getValue(id) + "&format=" + format;

  if (address != "") {
    ajaxPost(address, data,
    function(request) {
      parseCustomers(request, format, resultRegion);
    });
  }
}

function parseCustomers(request, format, resultRegion) {
  if ((request.readyState == 4) && (request.status == 200)) {
    var headings = new Array("Customer ID", "First Name", "Last Name", "Balance");
    var rows = null, customers = null;

    if ("xml" == format) {
      var xmlDocument = request.responseXML;
      customers = xmlDocument.getElementsByTagName("customer");
      rows = new Array(customers.length);
      var subElementNames = ["cust_id", "first_name", "last_name", "balance"];
      for (var i=0; i<customers.length; i++) {
        rows[i] = getElementValues(customers[i], subElementNames);
      }
    } else if ("json" == format) {
      var rawData = request.responseText;
      var data = eval("(" + rawData + ")");
      rows = data.customers;
    } else if ("string" == format) {
      var rawData = request.responseText;
      var rowStrings = rawData.split(/[\n\r]+/);
      rows = new Array(rowStrings.length -1);
      for (var i=1; i<rowStrings.length; i++) {
        rows[i-1] = rowStrings[i].split("#");
      }
    }

    var table = getTable(headings, rows);
    htmlInsert(resultRegion, table);
  }
}
函数检查客户(id、格式、结果区域){
var address=“cust lookup.jsp”;
var data=“cust\u id\u list=“+getValue(id)+”&format=“+format;
如果(地址!=“”){
ajaxPost(地址、数据、,
功能(请求){
解析客户(请求、格式、结果区域);
});
}
}
函数解析客户(请求、格式、结果区域){
if((request.readyState==4)和&(request.status==200)){
var标题=新数组(“客户ID”、“名”、“姓”、“余额”);
var行=null,客户=null;
如果(“xml”==格式){
var xmlDocument=request.responseXML;
customers=xmlDocument.getElementsByTagName(“客户”);
行=新数组(customers.length);
var subElementNames=[“客户id”、“名”、“姓”、“余额”];

对于(var i=0;i没有内置的方法来实现这一点,它由确定并丢弃(注:将在1.4.3中)

虽然您可以查看httpData源并自己运行相同的函数,但这有点浪费,因为jQuery已经在这么做了


如果您的选择仅为
json
html
,您可以检查
响应类型
,它应该是
“字符串”
对于HTML,否则您就有JSON,您也可以检查并确定JSON,例如:
类型和&type.propertyalways它们没有内置的方法来实现这一点,它由确定并丢弃(注意:它将在1.4.3中)

虽然您可以查看httpData源并自己运行相同的函数,但这有点浪费,因为jQuery已经在这么做了


如果您的选择仅为
json
html
,您可以检查
响应类型
,它应该是
“字符串”
用于HTML,否则您就有JSON,您也可以检查并确定JSON,例如:
类型和类型.propertyalways它们

很遗憾jQuery不允许在数据接收上使用JSON,但您的想法符合我当前的问题。谢谢。嗯,我尝试过,但不起作用……我总是得到typeof(响应)=='string'…我认为类似但笨拙的解决方案是try{eval(response);/*json/}catch(e){/html*/}@Sinuhe-成功的第三个参数是XmlHttpRequest,try
函数(resp,status,xhr){alert(xhr.getResponseHeader(“content type”);}
JSON与html的对比结果是什么?哦,我的错!我在创建JSON对象时没有添加内容类型标题。我会再试一次;)好吧,很遗憾jQuery不允许在数据接收时使用此选项,但你的想法符合我当前的问题。谢谢。嗯,我已经尝试过了,但不起作用……我总是得到typeof(响应)=='string'…我认为类似但笨拙的解决方案是try{eval(response);/*json/}catch(e){/html*/}@Sinuhe-成功的第三个参数是XmlHttpRequest,try
函数(resp,status,xhr){alert(xhr.getResponseHeader(“content type”);}
JSON和html的对比结果是什么?哦,我的错!我在创建JSON对象时没有输入内容类型标题。我会再试一次;)