Как отправить метод экземпляра JQuery в качестве обратного вызова API Google? - PullRequest
1 голос
/ 20 сентября 2011

Кто-нибудь ранее выяснил, как отправить объектный метод (плагин JQuery) в качестве обратного вызова API Google?Например, для API PageSpeed.

Во всех примерах показано, что вы отправляете имя глобальной функции, но я хочу каким-то образом отправить конкретный метод экземпляра (или способ пересмотреть объект JQuery).

Это основано на их выборке :

 var s = document.createElement('script');
 s.type = 'text/javascript';
 s.async = true;
 var query = [
   'url=' + url,
   'callback=runCallbacks',
   'key=' + settings.api_key,
 ].join('&');
 s.src = API_URL + query;
 document.head.insertBefore(s, null);

Так что я хочу добиться, это что-то вроде этого вызова:

 $('div.jq-google-plugin).MyGooglePlugin('callback',result);

Янастроить вызов в Google из метода init моего плагина.

например, я пробовал это - но это выдает 400 неверных запросов от API Google.

 var query = [
   'url=' + url,
   'callback='+ encodeURI('function(result){$(\'div.jq-google-plugin\').MyGooglePlugin(\'callback\',result);}’,
   'key=' + settings.api_key,
 ].join('&');

Что я на самом деле не делаюхочу сделать, это создать какой-то искаженный глобал, чтобы перехватывать ответы для каждого экземпляра плагина, но я думаю, что это единственный способ?(Это работает, кстати.)

 var query = [
   'url=' + url,
   'callback=myUniqueGlobalCallback',
   'key=' + settings.api_key,
 ].join('&');
 myUniqueGlobalCallback = function(result){$('div.jq-google-plugin).MyGooglePlugin('callback',result);}

Заранее спасибо за любые идеи!Я полагаю, что решение может не зависеть от API Google, но может быть связано с тем, почему оно отклоняет любую вещь, кроме глобального имени функции.

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Чего я действительно не хочу делать, так это создания некоего искаженного глобуса, чтобы перехватывать ответы для каждого экземпляра плагина, но я думаю, что это единственный способ?

Это единственный способ.Проблема здесь в том, что вы делаете вызов JSONP.Это означает, что вы на самом деле не вызываете никакой JavaScript.Вы динамически добавляете новый элемент скрипта на страницу.Этот элемент скрипта немедленно загрузит javascript в url, и javascript будет выглядеть примерно так:

yourCallback({data: "Some Data"});

Поскольку независимо от того, для чего ваш yourCallback должен быть строкой, вы не можете передатьобъект.Библиотека поддерживает то, что вы пытаетесь сделать, но за кадром это работает так, потому что это единственный способ, которым это может работать.

1 голос
/ 20 сентября 2011

jQuery имеет довольно хорошую поддержку JSONP.Вы должны использовать это вместо того, чтобы вводить элемент script самостоятельно.При этом вам даже не нужно заботиться о обратном вызове, и ответ автоматически перенаправляется на ваш success обратный вызов.

jQuery.fn.MyGooglePlugin = function() {
    $.ajax('<url>', {
        dataType: 'jsonp',
        data: {
            key: 'api-key'
        }
        success: function(response) {
            console.log(response);
        }
    });
};
...