SQLの窓 タグページ
 
Custom Search

2011年04月16日


prototype.js でクロスドメインの Ajax の読み込みテスト

表示は、console.log で行っています。各ブラウザの開発者ツールを
開いた状態でボタンをクリックして下さい。
IE : F12 => スクリプトタブ ( その後ページをリロード )
Firefox : Firebug のコンソール
Chrome : CTRL + SHIFT + I からコンソール
Safari : CTRL + ALT + I からコンソール

※ Opera は動きません

結局 IE8 用に prototype.js を改造するはめになりました。
テストした URL は、「Access-Control-Allow-Origin: *」 を返すように
していますが、prototype.js 内で、ヘッダーを変更している為、
セキュリティ回避の為、そのままでは エラーになるのでsetRequestHeaders
を無効にしています。( 偽装を拒否する為のようです )

IE8 の場合、インターネットオプションで、「ドメイン間でのデータソースのア
クセス」を有効にしてやると、Access-Control-Allow-Origin が無くても 
XMLHttpRequest でアクセスできるようになります。Access-Control-Allow-Origin
の有無で制御したい場合は、XDomainRequest を使用する必要があります

但し、XDomainRequest は、XMLHttpRequestとでは、イベントに互換性が無いよう
なのでこのような変更が必要になります。
<script type="text/javascript" src="http://lightbox.on.coocan.jp/prototype_x.js"></script>
<script type="text/javascript">
Ajax.Request.prototype.setRequestHeaders = function() {}
function testCall() {
new Ajax.Request('http://lightbox.on.coocan.jp/ver.php', {
	method: "get",
	asynchronous: true,
	onComplete: function(response) {
		console.log(response.responseText);
	}
});
}

</script>
<input type="button" value="実行" onclick='testCall();'>

以下は変更部分です
var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new window.XDomainRequest()},
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
  },

  activeRequestCount: 0
};
--------------------------------------------
      if ( Prototype.Browser.IE ) {
          var ieparam1 = this.options.onComplete;
          var ieparam2 = this.transport;
          this.transport.onload = function() { ieparam1(ieparam2) };
      }
      else {
          this.transport.onreadystatechange = this.onStateChange.bind(this);
      }

関連する記事

prototype.js を クロスドメイン対応にするパッチ
Google の prototype.js を使う

▼ クロスドメインで呼び出されるコード
<?
header( "Access-Control-Allow-Origin: *" );
header( "Content-Type: text/javascript; Charset=shift_jis" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );

$ver = phpversion();
print "document.write( '$ver' );";

?>



posted by at 2011-04-16 18:29 | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする






フリーソフト


バッチ処理
コマンドプロンプト


WEB テクニカル

Excel