从jQuery插件启动的JSONP方法的模式是什么?

时间:2010-04-06 10:40:19

标签: jquery jsonp

我正在编写一个jQuery插件,用于呈现从页面元素中的另一个域检索的数据。我遵循我的jQuery插件的典型模式:

$(selector).Plugin(options);

在插件中,我使用jQuery.getScript(url, [success])获取外部数据。外部数据源允许我定义方法的名称,它将在调用该方法时包装数据(JSONP):

$.getScript("http://www.example.com/data?callback=global_callback", instance_callback);

这实际上导致:

<script type="text/javascript">
  global_callback(data);
</script>

global_callback的范围限制了插件实例可以对数据执行的操作。并且global_callback方法不知道插件实例化的选择器或选项。

我认为global_callback只会存储数据,而插件会检索instance_callback中的数据。但我需要确保instance_callback将检索正确的数据,我预见插件的多个实例会出现问题。我怎么处理这个?

谢谢!

1 个答案:

答案 0 :(得分:1)

我可能不明白你在问什么。这些回调类似于常规JSON,除了您可以命名回调(如果需要)。在AJAX的上下文中执行,但当然除非您将其分配给不同的变量,否则这不可用。

如果您这样打电话,您甚至不需要为回调命名:

$.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")
      .wrap("<a href='" + item.link + "'></a>");
    if ( i == 3 ) return false;
  });
});

参考:http://docs.jquery.com/Release:jQuery_1.2/Ajax#Cross-Domain_getJSON_.28using_JSONP.29

如果您担心在插件实例中运行,请将此调用包装在闭包中。这样,您可以引用回调期间需要访问的任何实例。

function GetSomeData(){
  var that = this; //reference to the element you are working
  $.getJSON("...",function(data){
    //do some stuff to element with data
    $("element").data("JSONP",data);
  });

}