jQuery で JSONP 2通り

jQuery を使って JSONP でリクエストする方法を2通り紹介するよ。

その1: $("<script>")

document.createElement()$() を使って実現する。

$("<script>")
    .attr('type', 'text/javascript')
    .attr('src', "http://www.example.com/jsonp.cgi?param1=value1&callback=myCallback")
    .appendTo($("head"));

function myCallback(json){
    // ロード完了時にここが呼ばれる
}

http://www.example.com/jsonp.cgi?param1=value1&callback=myCallback にリクエストがいく。

callback のところは、サービスによって指定の仕方が違うかもね。

その2: $.ajax

$.ajaxdataTypejsonp が使える。

$.ajax({
    url : "http://www.example.com/jsonp.cgi",
    dataType : "jsonp",
    data : {
        param1 : "value1"
    },
    success : function(json){
        // ロード完了時にここが呼ばれる
    },
    error : function(){
        alert('error');
    }
});

こっちの方がシンプルに書ける。コールバック用の関数は jQuery が自動的に生成して、結果に応じて successerror を呼び出してくれる。

API によってはコールバックを指定するためのパラメータが callback ではなくて、別の名前の場合がある。このときは jsonp パラメータを指定する。

$.ajax({
    url : "http://www.example.com/jsonp.cgi",
    dataType : "jsonp",
    data : {
        param1 : "value1"
    },
    jsonp : "jsoncallback", // ← !!!これ!!!
    success : function(json){
        // ロード完了時にここが呼ばれる
    },
    error : function(){
        alert('error');
    }
});

裏側では、http://www.example.com/jsonp.cgi?jsoncallback=jsonp1197507452843&_=1197507453671&param1=value1 という URL にリクエストが行く。jsonp1197507452843 というのが jQuery が動的に生成するコールバック関数。呼び終わったら、ちゃんと自分自身を undefined にしているので、グローバル名前空間を汚すのも一瞬で済むようだ。