jQuery.getJSON()で別ドメインのJSONPなデータを読み込む時の注意

jQuery.getJSON(url, data, callback);
$.getJSON(url, data, callback);

jQuery1.2以降で、かつAPI側が対応*1していればですが、jQuery.getJSON() で別ドメインにあるJSONPデータを読み込めます。
JSONPを返すAPIというのは、どこかに仕様があるのか暗黙の習慣なのかは知らないけど、APIURIに callback=foo*2 といった引数を付ける事になります。
jQuery.getJSON() でもcallback=? をつけると説明する記事がちらほらありますが、ちょっと誤解しやすい気がします。
自分は勘違いしました。

$.getJSON('http://search.twitter.com/search.json?callback=?',
  {
    q: "#jquery"
  },
  function(data, status){
    $.each(data.results, function(i, item){
      console.log(item.text);
    });
  }
);

Twitter Search APIを例にしたコードです。
jQuery.getJSON() で JSONPを読み込むには、URIに callback=? を付けます。
ここで重要なのは ? です。
この ? は、SQLプレースホルダーみたいなもので、そのまま ? を書かないといけません。
解説記事であまり深く触れてないところが結構あって、最初は自分でコールバック関数名を指定できるのかと思いましたが、それは勘違いでした。


jQuery.getJSON() でJSONPを読み込もうとすると、callback=? は callback=jsonp1272137974675 の様なコールバック関数名に置き換えられます。
そしてjsonp1272137974675() が呼ばれてJSONデータが、jQuery.getJSON()の第3引数であるコールバック関数*3に引数で渡されます。

Same-Originポリシー

同じドメインのデータにしかアクセスできないというポリシー。
これがあるから、JSONJSONPという形で読み込む必要があります。

Exception: uncaught exception: [Exception... "Access to restricted URI denied"  code: "1012"

Firefoxで別ドメインJSONを、そのまま読み込もうとすると、この様な例外が発生します。

引数の書き方を変えてみてどうなるか

通る例
$.getJSON('http://search.twitter.com/search.json?callback=?&q=%23jquery',
  function(data, status){
    $.each(data.results, function(i, item){
      console.log(item.text);
    });
  }
);
通らない例
$.getJSON('http://search.twitter.com/search.json',
  {
    callback: "?",
    q: "#jquery"
  },
  function(data, status){
    $.each(data.results, function(i, item){
      console.log(item.text);
    });
  }
);

*1:JSONPに対応しているAPIならという意味。

*2:追記:コメントでも触れたけど、Flickrはjsoncallback=fooだったりします。callbackってところが多いけど、違うのにしてるAPIもある感じ。

*3:紛らわしいけど、JSONPの callback=? とは別の、jQuery.getJSON()の第3引数のコールバック関数