jQuery.getJSON - クロスドメインでもOK! [ jQuery ]

普通にsame originなサーバーからJSON形式のデータを受け取るのにも使える。

しかし真価はクロスドメインなサイトからのデータをJSONPで受け取ることにある。(と思う)

書式

$.getJSON( url, [data], [success(data, textStatus, jqXHR)] )

内部的には以下の呼び出しと等価。(なので$.ajax()でも書ける)

$.get( url, data, callback, "json" )

クロスドメインなところからJSONPでデータを取得した場合、url文字列に以下のような文字列を追加してjQueryにコールバックのフォーマットを教える。(「callback」の部分を適宜コールバックパラメータに置き換える)

http://ホゲホゲ/data/jsonp?callback=?

使わないで同じ事をしようとしたら…

理屈はわかってるつもりでも、jQueryを使わずに自分で書くと結構メンドクサイ。それはまあjQueryを使う時全般に言えることなんだけど…

var script = document.createElement("script");
script.type = "text/javascript";
script.src = "URL?callback=jsonpCallback";
script.onload = script.onreadstatechange = 後始末処理用関数;
document.getElementsByTagName("head")[0].appendChild(script);

function jsonpCallback(data) {
    /* データを受け取って実行したい処理 */
}

何がメンドクサイかというとこんなところかな。

  • コールバック関数はscriptタグが評価されるときにアクセス出来ないといけない。

    ので、グローバルな関数(という言い方でいいのか?)にする必要がある。何回も呼び出すととグローバルな名前空間を汚していくのが気持ち悪い。

  • 後始末用のロート終了処理あたりがそこはかとなくブラウザ依存。

    なので、リーク上等で後始末を放棄する(テストコートとかならこうする)か、徹底的に書いてスッキリする(本番コードはスッキリさせておかないとね)か、書くならどこまでどうやって動作確認するか、等、割り切りに悩む。

  • そもそも、scriptタグを追加してそれが評価されるとデータがロードされるという仕組みが気持ち悪くて、コード書いててあんまり自信がない。

    どんなライブラリでもやってることではあるんだろうけど。

0 件のコメント:

コメントを投稿