使用 jQuery 请求 JSONP 时,我可以使用静态(即预先确定的)回调函数名称吗?

Posted

技术标签:

【中文标题】使用 jQuery 请求 JSONP 时,我可以使用静态(即预先确定的)回调函数名称吗?【英文标题】:Can I use a static (i.e., predetermined) callback function name when requesting JSONP with jQuery? 【发布时间】:2010-12-09 03:52:28 【问题描述】:

jQuery documentation 列出了以下使用 $.getJSON 请求 JSONP 的示例:

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
  function(data) 
    $.each(data.items, function(i,item) 
      $("<img/>").attr("src", item.media.m).appendTo("#images");
      if (i == 3) return false;
    );
  );

而不是使用这个方法,因为这个参数会生成一个动态回调函数名:

jsoncallback=?

我希望能够提前将其设置为硬编码的函数名称,如下所示:

jsoncallback=test

这很有效,因为我运行脚本并且我返回的 JSONP 将 JSON 对象包装在对 test() 的调用中。

但是,我不知道如何设置回调函数。不应该就这么简单吗?

function test(data) 
  console.log(data);


$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=test");

当我尝试这样做时,我得到了包装在 test() 中的 JSONP,但我定义的函数 test() 从未被调用。我错过了什么吗?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

作为defined in the documentation供你使用以下方法

jQuery.getJSON(...)

您需要在进行 JSONP 调用时指定 callback=?。我通常只将它用于“json”的响应类型。对于“jsonp”的响应类型,您要使用:

jQuery.get(...)

并将type 指定为“jsonp”。请参阅此documentation on the subject。但这也受制于必须拥有callback=? 的事实。

我认为你是looking for is this:

jQuery.getScript(...)

应该执行您在callback 中定义的任何方法。

【讨论】:

非常感谢,尼克!估计我没找对地方。感谢您的帮助。【参考方案2】:

啊,“相关”侧边栏部分救了我。在我提交这个问题后,我发现一个类似的问题已经问过:

using a named function as the callback for $.getJSON in jQuery to satisfy Facebook request signing demands

邓肯 10 月 15 日的回答为我解决了这个问题:

window.fixed_callback = function(data)
  alert(data.title);
;

$(function() 
  $.getScript("http://api.flickr.com/services/feeds/photos_public.gne?tags=cats&tagmode=any&format=json&jsoncallback=fixed_callback", function(data) 
  alert('done');  );
);

我猜关键是使用 $.getScript 而不是 $.getJSON。仍然可以在 $.getScript 方法的参数中指定匿名回调函数,该回调函数将在请求 URL 参数中命名的回调函数之后执行(本例中为“fixed_callback”)。希望这对以后的人有所帮助。

【讨论】:

以上是关于使用 jQuery 请求 JSONP 时,我可以使用静态(即预先确定的)回调函数名称吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 中止 JSONP ajax 请求

使用 JSONP 和 JQuery 调用 REST Api

如何使用 jQuery 创建一个指定 contentType 的 jsonp POST 请求?

使用 jsonp 错误的 jQuery ajax 请求

使用 Jquery 的 Redmine API 请求,使用 JSONP,引发 mime 类型错误

使用 jQuery 1.5 将请求作为 jsonp 发送,将响应解释为文本