【问题标题】:can't add callback function to jquery getJSON无法将回调函数添加到 jquery getJSON
【发布时间】:2011-12-15 17:42:37
【问题描述】:

我正在尝试在 jquery 中执行跨域请求,其功能类似于 this gist 中的功能

我以为我的 JSON 不正确,但这是我从响应中得到的:

{"status":"OK","errorMessage":"","numberOfResults":10,"suggestions":[{"url":"http://dbpedia.org/resource/Bassiana","label":"Bassiana","owner":0},{"url":"http://dbpedia.org/resource/Julia_Soaemias_Bassiana","label":"Julia Soaemias Bassiana","owner":0},{"url":"http://dbpedia.org/resource/Julia_Bassiana","label":"Julia Bassiana","owner":0},{"url":"http://dbpedia.org/resource/Varius_Avitus_Bassianus_Marcus_Aurelius_Antoninus","label":"Varius Avitus Bassianus Marcus Aurelius Antoninus","owner":0},{"url":"http://dbpedia.org/resource/Bassianus_%28senator%29","label":"Bassianus (senator)","owner":0},{"url":"http://dbpedia.org/resource/Johannes_Bassianus","label":"Johannes Bassianus","owner":0},{"url":"http://dbpedia.org/resource/Julius_Bassianus","label":"Julius Bassianus","owner":0},{"url":"http://dbpedia.org/resource/Bassian_thrush","label":"Bassian thrush","owner":0},{"url":"http://dbpedia.org/resource/Bassianae","label":"Bassianae","owner":0},{"url":"http://dbpedia.org/resource/Bassian","label":"Bassian","owner":0}]}

我应该如何使它工作?由于 JSON 无效,因此似乎从未触发回调。

【问题讨论】:

  • 这似乎是一个有效的 JSON,至少对 JSONLint 来说是这样。你得到什么样的错误?
  • 您可以发布您的 $.post 电话吗?此外,如果您正在执行跨域请求,您可能应该考虑使用 JSONP 而不是 JSON。

标签: jquery cross-domain getjson


【解决方案1】:

问题不在于它是无效的(通过this site 会确认),而是它从未“包装”在回调方法中。

查找JSONp

如果您要致电 /getMyJSON?callback=myCallback,您的 JSONP 响应应该返回如下:

myCallback({"status":"OK","errorMessage":"","numberOfResults" ...);

(请注意,它现在包含在您应该在页面上定义的函数调用中,并准备好处理返回的结果)。

【讨论】:

  • 另外,查看previous answer I wrote up,它更详细地描述了该过程。
  • 我认为您在这里是正确的,但情况并非总是如此。您不必返回 JSONp 来进行跨域请求。 JSON/HTML/等。如果设置了正确的允许访问标头,将返回就好了。
  • @JackWink:99% 的情况下,AJAX 调用只会返回错误响应,因为它在不同的域之间传递。是的,您可以使用标头和事件客户端首选项来超越这一点,但最有效的解决方案是将其处理为 JSONp(恕我直言)
  • 你是对的,我并不是说你的答案是错误的,而是我想说他可能控制不了其他域,如果他们没有做过 JSONp,但是设置Access-Control-Allow-Headers: * 然后他会遇到麻烦,因为它没有用 JSONp 包装,但是 .getJSON() 依赖于包装器。
  • @mox601:这将避免大多数问题。此外,尝试使其接受“回调”url 参数,以便库可以通过尽可能少的重新配置来访问它(例如 $.getJSON)
【解决方案2】:

那不是 jsonp - jsonp 包含回调。您看到的要点并没有说明跨域。您将不得不查看该服务并查看您需要做什么才能使其返回 jsonp 而不是 json。

这是一个返回我最后一个 twitter 提要的示例调用:

http://twitter.com/status/user_timeline/rossdargan.json?count=1&callback=JSONPcallbackFunction

如您所见,结果被包裹在 JSONPcallbackFunction 中:

JSONPcallbackFunction([{"place":{"bounding_box":{"type":"Polygon","coordinates...

【讨论】:

    【解决方案3】:

    跨域请求需要使用 JSONP。 JSONP 请求实际上是作为脚本请求发送的,并要求您提供回调(和回调参数),以便服务器可以交付一个脚本,其中包含对回调函数的调用作为其内容。使用 getJSON 调用执行此操作的方法是将 &callback=? 附加到您的其他 URL 参数。这向 jQuery 说明它必须发出 JSONP 请求并指示它创建一个匿名函数来调用您的回调。

    注意:服务器必须支持 JSONP,因为它需要以不同的方式处理响应,即作为脚本返回,并将数据作为回调的参数提供。支持通过 Javascript 直接访问的服务应该支持 JSONP。如果服务不支持 JSONP,您需要在服务器上代理请求,因为您没有跨域浏览器限制,所以您可以将其请求为纯 JSON。

    $.getJSON('http://some.other.dom/controller/action?x=y&callback=?`, function(data) {
        // here the data is the deserialized JSON as an object
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      相关资源
      最近更新 更多