動的にscript
要素を追加してやることによってクロス・ドメインのJavaScriptファイルを読み込むというテクニック。Firefoxの場合は動的に追加するscript
要素のonload
属性で読み込んだJavaScriptファイルを処理するfunction
を指定してやれば問題ない。しかし、これをクロス・ブラウザで実現するには違ったアプローチが必要になる。そのひとつがJSON and the Dynamic Script Tag: Easy, XML-less Web Services for JavaScriptで取り上げられているJSONScriptRequest。XmlHttpRequest
と比較するとかなり機能が限定されたものだけど、扱いが手軽で限定された環境ではなかなか威力を発揮するっぽい。
JSONScriptRequestはどうやらJSONPと呼ばれている、JSONデータをcallback関数経由で渡すようにするアプローチを利用するためのクラス。つまり動的に読み込むJavaScriptファイルは、
callback({
foo: 'This is foo.',
bar: 'This is bar.',
foobar: 'This is foobar.'
});
というようにcallback関数が呼ばれる形のものでなければならない。そして、
<html>
<head>
<title>JSONScriptRequest Test</title>
<script type="text/javascript" src="jsr_class.js"></script>
</head>
<body>
<h1>JSONScriptRequest Test</h1>
<script type="text/javascript">
var oJsr = new JSONscriptRequest('http://example.com/json/data.json?dummy=1');
oJsr.buildScriptTag();
oJsr.addScriptTag();
function callback(data) {
alert(data.foo);
alert(data.bar);
alert(data.foobar);
oJsr.removeScriptTag();
}
</script>
</body>
</html>
HTML(やJavaScript)ファイル側でcallback関数を定義しておく必要もある(サンプル)。
つまるところ、Webサービス側でJSONPに対応していないと使い道がない。Yahoo! Search Web Servicesなどでは対応しているが、やはり絶対数は少ない。
しかし、Amazon Web ServicesのXSLTサービスなどの場合は、XSLファイルを工夫すればJavaScriptファイルを自由に作り上げることができるので、XSLファイル側で対処できる。labs.hail2u.net/amazon/やlabs.hail2u.net/amazon/asamashi/では実際に対処してみた。それぞれのHTMLファイル内のJavaScriptコードや利用しているXSLファイルを見てくれればどういう感じなのかわかるかもしれない。無闇にコードが長いので読みづらいけど。
jsr_class.jsはremoveScriptTag()
とか長くて書くの面倒な感じなので、テキトウに書き直すのが良いかも。