Каков шаблон для метода JSONP, который был инициирован из плагина jQuery? - PullRequest
0 голосов
/ 06 апреля 2010

Я пишу плагин 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 ограничивает возможности экземпляра Plugin для данных. И метод global_callback не знает селектора или опций, с которыми был создан плагин.

Я думал, что global_callback просто сохранит данные, а плагин получит данные в instance_callback. Но мне нужно убедиться, что instance_callback будет получать правильные данные, я предвижу проблему с несколькими экземплярами плагина. Как я могу справиться с этим?

Спасибо!

1 Ответ

1 голос
/ 06 апреля 2010

Возможно, я не понимаю, о чем вы спрашиваете. Эти обратные вызовы работают аналогично обычному 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);
  });

}
...