普通に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 件のコメント:
コメントを投稿