【问题标题】:How can I tell whether the returned data of a successful $.ajax() is of html or json?如何判断成功 $.ajax() 的返回数据是 html 还是 json?
【发布时间】:2012-04-28 01:46:54
【问题描述】:

我有一个通过 jQuery .ajax() POST 提交到服务器的表单。如果表单通过了服务器端的验证,服务器将返回 HTML 格式的结果,以便客户端相应地更新其表示。但是,如果表单验证失败,服务器将以 JSON 格式返回结果,其中包含验证错误。

这两种类型的结果都会在.ajax() 的success 处理程序中结束。由于这两种类型都是可能的,因此处理程序需要一种方法来确定结果是 HTML 还是 JSON。我该怎么做?

注意:从表面上看,我的问题与this existing SO question 相同,但它们并不相同。在那个问题中,只有一种可能的数据类型(HTML 或 JSON),而我的问题是寻找一种方法来处理两种可能的数据类型(HTML 和 JSON)。

【问题讨论】:

    标签: jquery


    【解决方案1】:

    如果您将dataType 参数留空,jQuery 将根据 MIME 类型确定这一点:

    数据类型字符串

    默认:智能猜测(xml、json、脚本或 html)

    您期望从服务器返回的数据类型。如果没有指定,jQuery 将尝试根据响应的 MIME 类型推断它

    参考:http://api.jquery.com/jQuery.ajax/

    【讨论】:

    • 我的问题是我有两个不同的代码块要执行,具体取决于返回的数据所在的数据类型。success 处理程序有一个 if 语句用于确定要执行的代码块,但我不知道if 语句可以用来检查什么。
    • jQuery 已经为您解析了它,因此如果它是 JSON,它将是一个有效的 Javascript 对象,如果它是 HTML,它将是一个字符串。
    • @ahmoo:正如 Paystey 所说,您可以使用 typeof(response) 检查返回的是 object 还是 string...
    【解决方案2】:

    对于 json 数据,typeof(data) 将是 object。对于 html 数据,它将是 string。

    至少对于从 ASP.NET MVC3 操作返回的数据,它可以工作。我假设是 mime 类型决定了 jquery 如何处理返回的数据。

    【讨论】:

    • 我已经用一些基本的 Ajax 调用对其进行了测试,它似乎工作得很好。不过,你在答案上领先我 30 秒。
    【解决方案3】:

    使用typeof,它会报告你处理的数据类型。

    FIDDLE

    【讨论】:

      【解决方案4】:

      如果您 100% 确定您提供给 jQuery 的数据没有恶意 XSS 攻击,那么您可以使用 JavaScript 的 eval() 方法来发挥您的优势。

      感谢@SLaks 为a suggestion 换掉我使用的讨厌的eval()。

      您可以使用$.parseJSON 将原始文本字符串转换为 JSON 对象

      function ajaxResponse(raw_data){
        try{
          // eval("var response="+raw_data); // try and avoid this if possible
          var response = $.parseJSON(raw_data);
          if (response){
            // We have a JSON inside the 'response' variable!
          }
        } catch(e){
          // We do not have a JSON.
          // Probably HTML content.
          // Might be a malformed JSON.
        }
      }
      

      如代码中所述,请注意,如果您传递了格式错误的 JSON 对象,那么您的回调会将其视为 HTML。

      请注意,$.ajax() 调用指定的 dataType 必须是 text,这样 jQuery 就不会尝试为您解析它。


      我们都喜欢让我们的生活更轻松的替代方案 - 这里有一个适合您的情况。
      为什么不总是返回 JSON 对象?可能是这样的:

      {"err":"","html":"<div>foobar<\/div>"} 
      

      对于一个错误:

      {"err":"1","message":"You did not foo all of your bars yet!"} 
      

      【讨论】:

      • @sla - 谢谢!确实,这是更好的选择。编辑以反映这一点。
      【解决方案5】:

      为什么不直接使用 JSON 来返回 HTML?

      我通常做的是这样设置我返回的 JSON 对象:

      {
        //s=status, d=data
        "s":0, //0 means success, other numbers are for different errors
        "d":{ /* Other JSON object or string here */ }
      }
      

      所以,在你的情况下,你会做这样的事情(伪):

      if (StuffIsValid()) {
          ResponseWrite('{"s":0,"d":"<html>html code here</html>"}');
      } else {
          ResponseWrite('{"s":1,"d":{"errlist":["err1","err2"]}}');
      }
      

      当然,您希望使用内置 JSON 库作为您选择的服务器端语言,而不是使用字符串。

      然后,在您的 jQuery success 回调中,我会检查 s 的值。

      $.ajax({
          url: 'url',
          dataType: 'json',
          success: function(data) {
              if (data) {
                  //We have a JSON object
                  if (data.s === 0) {
                      //Success!
                      //Do stuff with data.d as a string
                  } else if (data.s === 1) {
                      //Failed validation
                      //Do stuff with data.d as an object
                  } else {
                      //How did this happen?
                  }
              } else {
                  //Uh oh, no object, user must have been logged out (or something)
              }
          });
      

      如果用户必须登录才能访问您发布到的页面,这将特别有用,因为您可以发现返回的数据不是 JSON 对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-19
        • 1970-01-01
        • 1970-01-01
        • 2014-01-11
        • 2013-01-15
        • 2015-09-17
        • 2012-01-24
        相关资源
        最近更新 更多