Ajaxの要であるXMLhttpRequestはもともとMicrosoftがActiveXオブジェクトとして実装したものなんですが、これにならって他のブラウザは組み込みオブジェクトとして実装されました。
IE5とIE6ではActiveXが禁止されている場合では使用できないんですが、IE7になってようやくブラウザ組み込みとして再実装されました。
実際に使う場合IE6とそれ以外のブラウザでは作法がかなり違います。(IE5は試してないのでここでは例外とします)
if(typeof window.XMLHttpRequest == "undefined"){
if(typeof window.ActiveXObject == "function"){
try {
new ActiveXObject("Msxml2.XMLHTTP");
window.XMLHttpRequest = function(){
return new ActiveXObject("Msxml2.XMLHTTP");
}
}
catch (e) {
try {
new ActiveXObject("Microsoft.XMLHTTP");
window.XMLHttpRequest = function(){
return new ActiveXObject("Microsoft.XMLHTTP");
}
}
catch (e) {
}
}
}
}
Ajax = new window.XMLHttpRequest();これで一応IE6でもそれ以外でも動作するXMLhttpRequestのインスタンスが作れるんですが、絶妙に不便な違いがあります。
その1. this
onreadystateプロパティに関数をセットして使うわけなんですが、セットした関数内での this が指すのはIE6では windowオブジェクトです。ActiveXオブジェクトなんだから当然といえば当然ですね。
IE6以外のブラウザでは関数を呼び出したXMLhttpRequestオブジェクト自身を指します。
その2. プロパティの追加
IE6での実体はActiveXオブジェクトなので、独自にプロパティを追加することができません。IE6以外の場合はできます。
複数のインスタンスで同時にいくつもの非同期アクセスをしようとしたらちょっと面倒くさいことをしなければならなそうです。まあそこまでたくさんのセッションを張ってアクセスしまくるのもどうかと思いますが。でも将来的にはできるように拡張性の高いライブラリを作っておいたほうがよさそうです。
それにしてもクロスブラウザは鬼門が多すぎる。誰か統一して...!
そんな感じです。
よしなに。
ランキング支援お願いします!

コメントする