3

jQuery 文档列出了以下使用 $.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() 从未被调用。我错过了什么吗?

谢谢你的帮助!

4

2 回答 2

3

正如文档中定义的那样,您可以使用以下方法

jQuery.getJSON(...)

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

jQuery.get(...)

并将其指定type为“jsonp”。请参阅有关该主题的文档。但这也受制于必须拥有callback=?.

我认为您正在寻找的是

jQuery.getScript(...)

哪个应该执行您在callback.

于 2009-10-22T16:14:52.973 回答
1

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

使用命名函数作为 jQuery 中 $.getJSON 的回调来满足 Facebook 请求签名需求

邓肯 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”)。希望这对未来的人有所帮助。

于 2009-10-22T16:18:59.507 回答