クラスブラウザで利用できるようにする
ここまで見てきた通り、IE6.0とそれ以外のブラウザでは「XMLHttpRequest」オブジェクトの取得方法が異なっています。それぞれのブラウザ毎にページを分けるのは非効率ですので、どのブラウザで見に来た場合でも同じページで対応できるように変更してみます。
まずブラウザの判定を行います。IE6.0以外の「XMLHttpRequest」オブジェクトをサポートしているブラウザの場合は「window.XMLHttpRequest」が存在するかどうかでチェックできます。またIEの場合は「window.ActiveXObject」が存在するかどうかでチェックできます。
var xmlHttp; if (window.XMLHttpRequest){ xmlHttp = new XMLHttpRequest(); }else{ if (window.ActiveXObject){ xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }else{ xmlHttp = null; } }
ここでチェックする順番も重要です。と言うのはIE7.0ではどちらでも対応できるようになっているので、最初に「window.XMLHttpRequest」が存在するかどうかの記述をした場合はIE7.0でも他のブラウザと同じ処理が行われます。そうではなく次のように「window.ActiveXObject」が存在するかどうかをチェックした場合は、IE7.0ではIE6.0の場合と同じようにActiveXオブジェクトが使われます。
var xmlHttp; if (window.ActiveXObject){ xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }else{ if (window.XMLHttpRequest){ xmlHttp = new XMLHttpRequest(); }else{ xmlHttp = null; } }
どちらがいいのかは分かりませんが、IEでもその他のブラウザでも同じような処理が可能ならば同じ処理をした方が好ましいと思いますので、最初の記述方法を推奨します。
サンプルプログラム
では実際に試して見ます。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0.1//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" Content="text/html;charset=Shift_JIS"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>非同期通信テスト</title> <script type="text/javascript"> <!-- var xmlHttp; function loadText(){ if (window.XMLHttpRequest){ xmlHttp = new XMLHttpRequest(); }else{ if (window.ActiveXObject){ xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }else{ xmlHttp = null; } } xmlHttp.onreadystatechange = checkStatus; xmlHttp.open("GET", "http://www.ajaxtower.jp/sample/plan.txt", true); xmlHttp.send(null); } function checkStatus(){ if (xmlHttp.readyState == 4 && xmlHttp.status == 200){ alert(xmlHttp.responseText); } } // --> </script> </head> <body> <h1>非同期通信テスト</h1> <form> <input type="button" value="ファイル読み込み" onClick="loadText()"> </form> </body> </html>
上記のHTMLページをブラウザ(今回はIE7.0)で見てみると次のように表示されます。
HTMLページ内のボタンをクリックすると、サーバからファイルを読み込み、データの受信が完了するとファイル内に記述されたテキストをダイアログで表示します。
( Written by Tatsuo Ikura )