dojo toolkitのScriptSrcIO

dojoの0.3.0に、動的スクリプトロードを使ったクロスドメインJSON読み込み(ScriptSrcIO)が組み込まれているらしい、というのを聞いたので、ちょっと試してみる。

これはnightlyのテストページだけど、実際に0.3.0のパッケージにはScriptSrcIOはもう入っている。
http://archive.dojotoolkit.org/nightly/tests/io/test_ScriptSrcIO.html

とりあえずテストページのサンプルを見て、作ってみる。
接続先はまあAPIキーのいらないdel.icio.usで試そう。

<html>
  <head>
    <script type="text/javascript" src="./js/dojo.js"></script>
    <script type="text/javascript">
      dojo.require("dojo.io");
      dojo.require("dojo.io.ScriptSrcIO");
    </script>
  </head>
  <body>
    <script type="text/javascript">
      function getPosts(deliciousId) {
        dojo.io.bind({
          url: 'http://del.icio.us/feeds/json/'+deliciousId,
          transport: "ScriptSrcTransport",
          jsonParamName: "callback",
          load: function(type, data, event, kwArgs) {
            renderPosts(data);
          }
        });
      }

      function renderPosts(posts) {
        var div = document.getElementById('posts');
        var html = '<ul>';
        for (var i=0; i<posts.length; i++) {
          html += '<li>';
          html += '<a href="'+posts[i].u+'">';
          html += posts[i].d;
          html += '</a>';
          html += '</li>';
        }
        html += '</ul>';
        div.innerHTML = html;
      }
    </script>

    <input type="text" id="deliciousId" />
    <input type="button" onclick="javascript:getPosts(document.getElementById('deliciousId').value)" value="Get Delicious Posts"/>

    <div id="posts"></div>

  </body>
</html>

こんな感じか。

とりあえず、先のJsonWebServicesStubくらいのことはできるね。特にJSONPに関しては、ぱっと見の違いはタイムアウトの実装とかそのあたりくらいかな。

ところで、JSONの関数コールバックはJSONP(JSON with Padding)って言う呼び方に決定で、いいのかな?少なくともJSONPについて日本人が言及しているのをほとんど見たことないんだけど。

なんとなく日本人の作ったJSONサービスって、XML2JSONECナビのように、変数にJSONを埋め込む型が多い気がする。どっちも変数/関数がグローバルレベルになってしまうのは仕方ないし、その上でできることはほぼ同じなのでまあいいのだけど、シンプルさではJSONPのほうがなんとなく勝ってる感じ。

とくにこういうdojoのようなライブラリでのサポートによって、クロスドメインの呼び出し方が標準化されるのであれば、まあ別にそろえてしまっても良いんじゃないか?と思うのですが。