Flashを使った半クロスドメインのXMLHttpRequestのようなもの - ヒルズで働く@robarioの技ログ を見てね!
crossdomain.xmlが置かれているサーバと通信できるXMLHttpRequestのようなものを作りました。 → crossdomain.swf
特長とか
- crossdomain.swfをロードするとJavaScript側にCrossDomainXMLHttpRequestクラスが定義されるので、あとはXMLHttpRequestと同じように使えます。
- ポリシーファイルが/crossdomain.xmlじゃ無い場合、CrossDomainXMLHttpRequest.addPolicyFileを使って追加できます。
- ちょっと急ぎで作ったので今のところopen,sendぐらいしかできません。
- あと今のところsynchronousはできません。
- crossdomain.swfの読み込みが完了しないとダメなので、function CrossDomainXMLHttpRequestが定義されるまで待つ必要があります。
- …というのが少々面倒なので、onloadパラメータに関数名を設定しておくと定義完了直後に呼んでくれるようにしてあります。
- でもsend()をcrossdomain.swfの読み込み完了まで遅延させればいいだけなので(というか最初はそのようにしていたので)、次のバージョンで気にしなくてもいいようになると思います。
- (;゚д゚)ァ.... 必要ファイルをswf1個にしたから、swfの読み込みが終わらないとtypeof CrossDomainXMLHttpRequest=='undefined'だから遅延send()とかできないじゃんorz(どうしようかな)
- でもsend()をcrossdomain.swfの読み込み完了まで遅延させればいいだけなので(というか最初はそのようにしていたので)、次のバージョンで気にしなくてもいいようになると思います。
- …というのが少々面倒なので、onloadパラメータに関数名を設定しておくと定義完了直後に呼んでくれるようにしてあります。
作業中
使い方
SWFObjectを使用した例
<body> <div id="crossdomain_swf_container" style="position:absolute"></div> <script type="text/javascript" src="../vendor_js/swfobject.js"></script> <script type="text/javascript"> //<![CDATA[ function on_crossdomain_swf_loaded() { var req = new CrossDomainXMLHttpRequest(); // req.addPolicyFile('http://example.com/crossdomain.xml'); req.open('GET', 'http://twitter.com/statuses/public_timeline.xml', true); req.setRequestHeader('content-type', 'application/x-www-form-urlencoded; charset=UTF-8'); req.onreadystatechange = function() { if (req.readyState != 4) { return; } alert(req.responseText); }; req.send(''); } var swfobject = new SWFObject('crossdomain.swf', 'crossdomain_swf_external', '0', '0', '9', '#ffffff'); // 'crossdomain_swf_external'ってid指定してますけど、実際は何でもいいです。idを使わずに走査してますので。 swfobject.addVariable('onload', 'on_crossdomain_swf_loaded'); swfobject.write('crossdomain_swf_container'); //]]> </script> </body>
サーバ側にプロキシいらずで、使い慣れたインターフェイスで、(crossdomain.xmlがあれば)クロスドメインでGETもPOSTもPUTもDELETEも色々できるのは楽しい。