JavaScriptはブラウザのバージョンがアップする度に機能が拡張されるため、 どの(JavaScript対応の)ブラウザでも動くようにするには 注意を払う必要があります。 ここでは特に Internet Explorer 3.0 でも動くようにするための注意点を述べます。Netscape Navigator 2.0 でも動くようにするのは難しそう、 というかコードが膨大になりそうです。 私は職場では NN2.0 も使っていますが、 いくつかの有名サイトでは必ずエラーのダイアログが大量に出て、 それを閉じるのに一苦労といった状態です。
また、Netscape Navigator と Internet Explorer との違いについても まとめてみました。
IE3.0 では Arrayオブジェクトのメソッドは サポートされていません。そのため配列関係の多くの便利なメソッドを使うためには、 IE3.0用にそのメソッドと同様の機能を持つサブルーチンを用意する必要があります。 例えば、sort と join では次のようになります。
function test1() {
var a = new Array(3, 1, 4, 2);
if(navigator.appVersion.indexOf("2.0") == -1) { //IE4,NN3,4
a.sort(); //昇順に並べて
alert(a.join(",")); //カンマで繋げて表示
}
else { //IE3,NN2(但しNN2では動かない)
sort2(a);
alert(join2(a, ","));
}
}
IE3.0 かどうかを判別して(今回かなり手抜きです)、
そうであれば自分で用意したサブルーチンを走らせます。
そして、IE3用のサブルーチンは次のようになります。
function sort2(arr) {
var i, j, tmp, n = arr.length;
for(i = 1; i < n; i++) {
tmp = arr[i];
for(j = i - 1; j >= 0 && arr[j] > tmp; j--)
arr[j+1] = arr[j];
arr[j+1] = tmp;
}
}
function join2(arr, deli) {
var i, str, n = arr.length;
str = arr[0];
for(i = 1; i < n; i++)
str += deli + arr[i];
return str;
}
あと、reverseメソッドは、
function reverse2(arr) {
var i, tmp, n = arr.length, j = n - 1;
for(i = 0; i < parseInt(n / 2); i++) {
tmp = arr[i]; arr[i] = arr[j]; arr[j--] = tmp;
}
}
Stringオブジェクトの
splitメソッドは、
b = "1,2,3,4,5";
a = new Array(); //あらかじめ配列オブジェクトとして領域確保
split2(b, ",", a);
function split2(str, deli, arr) {
var prepos = 0;
var index = 0;
var deli_length = deli.length;
//strからdeliが検索されなくなるまでループする
while((pos = str.indexOf(deli, prepos)) != -1) {
arr[index++] = str.substring(prepos, pos);
prepos = pos + deli_length;
}
arr[index] = str.substring(prepos);
}
などとします。
Imageオブジェクトは IE3.0 ではサポートされていないのでコーディングできません。
Selectオブジェクトでは 項目の追加と削除ができません。
Dateオブジェクトに対し、 演算を行なうことはできません。
Netscape Navigator と Internet Explorer では微妙に動作が異なります。 概ね、IE の方がチェックが甘い(柔軟に解釈してくれる)ようですので、 必ず NN でチェックした方がよいでしょう。ただし逆の場合もあります。
フォームの要素(例えばボタン)にアクセスするとき、 IE では document を省略できますが、 NN では省略できません。
document.form1.button1.value = "押してね☆";
Arrayオブジェクトの
sortメソッドは微妙に動作が違います。
IE は安定ですが、 NN は安定ではありません。
例はこちら。document.open などでページを作るとき、 NN と IE では動作が異なります。詳しくはこちら。 日本語を扱うとき、 NN では全角1文字を2文字として扱いますが、 IE では1文字として扱うため動作が異なってきます。 詳しくはこちら。
ウィンドウを新たに開くときのオプションの指定は、 IE の方がフォーマットが自由なため注意が必要です。 詳しくはこちら。
ウィンドウの内容がロードされたときに実行されるコードを指定する windowオブジェクトの onLoadイベントハンドラは IE では小文字でなければなりません。 詳しくはこちら。
(*) 奥村晴彦 C言語による最新アルゴリズム事典 技術評論社