1

(JQueryプラグイン)オブジェクトスコープのメソッドをGoogle APIコールバックとして送信する方法を以前に理解した人はいますか?たとえば、PageSpeedAPIの場合。

すべてのサンプルは、グローバル関数の名前を送信することを示していますが、特定のインスタンスメソッド(または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);

プラグインのinitメソッド内からGoogleへの呼び出しを設定しています。

たとえば、これを試しましたが、これにより、GoogleAPIから400の不正なリクエストが生成されます。

 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);}

洞察を事前に感謝します!解決策はGoogleAPI固有ではないかもしれませんが、グローバル関数名以外のものを拒否する理由の周りにある可能性があります。

4

2 に答える 2

1

jQueryはJSONPをかなりうまくサポートしています。スクリプト要素を自分で挿入する代わりに、これを使用する必要があります。これにより、コールバックを気にする必要がなくなり、応答は自動的にsuccessコールバックにルーティングされます。

jQuery.fn.MyGooglePlugin = function() {
    $.ajax('<url>', {
        dataType: 'jsonp',
        data: {
            key: 'api-key'
        }
        success: function(response) {
            console.log(response);
        }
    });
};
于 2011-09-20T02:43:39.227 に答える
1

私が本当にしたくないのは、各プラグインインスタンスの応答をキャッチするためだけに、名前が変更されたグローバルを作成することですが、これが唯一の方法だと思いますか?

それが唯一の方法です。ここでの問題は、あなたがしているのはJSONP呼び出しであるということです。つまり、実際にはJavaScriptを呼び出していないということです。新しいスクリプト要素をページに動的に追加しています。そのscript要素はすぐにURLにjavascriptをロードし、javascriptは次のようになります。

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

これが機能するには、yourCallbackが文字列である必要があるため、オブジェクトを渡すことはできません。あなたがやろうとしていることに対するライブラリのサポートがありますが、舞台裏では、それが機能する唯一の方法であるため、それが機能する方法です。

于 2011-09-20T02:44:59.540 に答える