jQuery:获取Ajax响应的类型

时间:2010-08-10 00:17:37

标签: javascript ajax jquery

我需要发出一个Ajax请求,但它的响应可能会有所不同,并且在服务器端决定。

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

它可能类似于:

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

2 个答案:

答案 0 :(得分:2)

如果您也可以控制服务器端代码,最简单的方法可能是包含一个带有值的参数来指定格式。

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

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);
  }
}

答案 1 :(得分:2)

没有内置的方法来执行此操作,它由jQuery.httpData确定并抛弃(注意:它将在1.4.3中为jquery.ajax.httpData。)

虽然你可以看看httpData源并自己运行相同的函数,但这有点浪费,因为jQuery已经这样做了。我

如果您的选择仅为jsonhtml,则可以检查typeof response,对于HTML应该是"string",否则您有JSON,您也可以检查并且也要确定,例如:type && type.propertyAlwaysThere