Webプログラマーでない人にはちんぷんかんぷんだと思うので読み飛ばしてOKです。笑
ajaxで使われるXMLHTTPRequestって、そのHTMLが置いてあったサーバ以外との通信ができない(クロスドメイン通信ができない)ので、クロスドメイン通信がしたかったらサーバ側にプロキシ用のCGIを置いてやる必要があったわけです。
また、そもそもXMLHTTPRequest命令が使えないブラウザなんかもあったりして(携帯のフルブラウザとか、DSとか、はたまはた“古ブラウザ”とか)、何かと制限が多かったのですが…。
なんと、ajaxを、「scriptタグを動的に生成する」ことで行っちゃおうというアイデアを発明した人がいて、これがうまく動くようなんですよ実際。DSとかでも動くようで。
scriptタグって、srcに指定されたURLからjavascriptを取ってきて実行するっていうHTMLの命令ですが、これはクロスドメインが可能なので、じゃあそのURLにパラメータつけて渡してやればいいじゃん、という。
最近の「ブログパーツ」系は大抵このテクニックを使ってますよね。地図とかブログに貼り付けたりするアレです。
で、そのテクニックを使って非同期通信の仕組みを作っちゃったのがこれ。
http://archive.dojotoolkit.org/nightly/tests/io/test_ScriptSrcIO.html
ScriptSrcIOという名前がついてるみたいだけど、正式名称はどうなるかな?
ScriptSrcIOのテクニックのポイントの一つが、「戻り値をJSONPで返す」ということ。
ちなみにこれも知らなかったのだけど、JSONPというプロトコルも最近主流になってきているみたいで、これはJSONのレスポンスを「関数呼び出し」の形で返して貰うというもの。
どういうことかというと、例えばScriptSrcIOを使ったときに、戻りをJSONで返してしまうと、それは単にjavascriptエラーになってしまうわけです。
なので、せめて
var result = JSON形式のデータ;
とか、
foo( JSON形式のデータ );
の形で返してくれないといけないのですが、これをプロトコルとして定めたのがJSONP。
簡単に言うと、リクエストに文字列をつけると、JSONデータに()をつけた上でその文字列を頭につけて返してくれる、というもの。
例えば
jsonpwebservice.php?jsonp=onRequestDone
とリクエストすれば、
onRequestDone( JSON形式のデータ );
という形で返してくれます。
つまり、自動的にリクエスト完了時に指定した関数を呼び出してくれるわけです。
まさにScriptSrcIOにうってつけ。ていうかそのためのプロトコルなのかな?JSONPは。
もちろんScriptSrcIOは、呼び出される側がJSONPに対応していないと使えないのだけど、既にAmazonやYahoo!、del.icio.us、Googleなどでも使えるようになっているようで、今後主流になりそう。
ま、ブラウザのセキュリティ強化で将来使えなくなる可能性も大なんだけどね。

【参考】
http://d.hatena.ne.jp/wakufactory/20060811#p1
http://d.hatena.ne.jp/shinichitomita/20060804/1154717649
http://d.hatena.ne.jp/shinichitomita/20060522/1148276164









これはXMLHTTPRequestの仕様ではなくて、JavaScriptのオリジンサーバポリシー
によるものではないでしょうか。他のサーバと通信はできるけれど、その内容に
HTMLが置いてあったサーバのJavaScriptがタッチできないだけで。 — anonymous @ 12:30PM 2006-12-07
ということは、他のサーバーへ情報を「送信」することはできてしまうということなんでしょうか?
だとすると微妙になんのための制限なんだろうって感じですね…。 — chikura @ 12:43PM 2006-12-07
サーバ間通信とは異なり,トラストな領域とはブラウザは異なり異なります.
しかしサーバーによってはもちろん対策を取った上での許可により利便性が向上すると思われます.
Chrome側のXPCOMMでは可能らしいですし,まだまだ抑えるべき背景がある様ですね.(謎 — anonymous @ 03:50AM 2009-01-27