【问题标题】:How to check if ajax response is javascript content type?如何检查ajax响应是否为javascript内容类型?
【发布时间】:2014-08-30 23:30:03
【问题描述】:

我有几种不同的形式,每种形式都返回不同的东西。我需要检测它是否是一个简单的字符串(所以我可以将它放在错误/状态区域)或者它的 javascript 我什么都不做并让它执行。

这就是我目前的检查方式,但我想确保这是 100% 坚固可靠......我想不出任何其他方式。

另一种选择是始终使用 JSON,但我需要一个 JSON shim,以及以某种方式尝试将 javascript 序列化为 JSON。

  $.ajax({
    type: 'POST',
    url:  form.attr('action'),
    data: form.serialize()
  })
  .done(function(data, textStatus, xhr) {
    if (!xhr.getResponseHeader('Content-Type').match(/text\/javascript/i)) {
      form.find('.status').text(data).removeClass().addClass('status status-done').slideDown(200);
    } else { 
      // this is where i do nothing and let JS run
    }
  })

以下工作,但我担心在某些极端情况下它不会工作(不确定可能是什么,但重要的是这部分工作 100%)

【问题讨论】:

  • 为什么需要 JSON 垫片?您需要支持哪些古老的浏览器?我认为您在这里遇到了 XY 问题...
  • 我建议您阅读 ajax 数据类型,因为您似乎得到了一些不好的信息。 api.jquery.com/jquery.ajax
  • 那我应该如何区分 JSON 和 application/javascript?
  • @Tallboy 服务器/应用程序应该以Content-Type: application/json 响应或至少与 JSON 类似。 (除非是JSON-P。)
  • 我知道,但我的问题围绕着......让我的 .done() ajax 承诺确定响应是否为 application/json 的最佳方法是什么(在表单上方显示错误消息),或者... application/javascript (什么都不做,让 JS 执行。我不想将响应 JS 注入表单,所以我需要确定内容类型)

标签: javascript jquery ajax


【解决方案1】:

注意,不确定要求的细节。如果正确解释问题,在不同的form 元素,来自$.ajax() 请求的不同响应类型? a) 检查响应类型 string ? b) 什么都不做?

可能会在json 响应中检查响应类型string

if (typeof data.data === "string") { 
  // do stuff , with `string`
}

如果 $.ajax() 期望 json 响应,接收 js ,可以立即运行该片段。在下面的部分,第一个响应是 string,通过 if 在 .done() 过滤。第二个响应 json 对象具有 js 函数表达式作为属性,它似乎立即运行,在 $.ajax() success textStatus 。仍然能够在else 上检查type 的object 的响应,但是,以script 运行。在console 看到空的xhr.repsonseText 和xhr.reponseJSON

试试

var urls = [["/echo/json/","abc"]
            , ["/echo/json/",
              {"abc": 
                (function() { 
                    setTimeout(function() {
                        $("body").append("<div id=data>" 
                        + "object" + "</div>"); 
                        $("#data")
                        .hide(0)
                        .fadeIn(1200)},1200) 
                 }())
               }]
            ];


    var request = function(url, _data) {
    $.ajax({
        type: 'POST',
        url:  url,
        data: {json : JSON.stringify({"data":_data})}
      })
      .done(function(data, textStatus, xhr) {
        if (typeof data.data === "string") {
            $("body").append("<div>" + data.data + "</div>")
        } else { 
            console.log(typeof data.data
                        , data
                        , xhr.responseText
                        , xhr.responseJSON);
          // this is where i do nothing and let JS run
        }
      })
    };

    $.each(urls, function(k, v) {
      request(v[0], v[1])
    });

jsfiddle http://jsfiddle.net/guest271314/y9b7t740/

见

jQuery getScript() vs document.createElement('script') , script.js

Calling a JavaScript function returned from an Ajax response

jQuery: Evaluate script in ajax response

What is JSONP all about?

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 2011-04-14
    • 2011-11-09
    • 2013-05-17
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    相关资源
    最近更新 更多