Logo address

Javascript: id

僕はまだ Javascript には慣れていない。それにこの言語はどこかすっきりとしない所があり、好きな言語ではない。(でも Perl や PHP 程嫌悪感は覚えない。)

今日は次のような現象に出会った。次のプログラムで eform への代入は Mozilla では問題ないが、IE では "OK1" のメッセージは出るが "OK2" のメッセージは出ない。

<form id="eform" ...>
<input id="text" name="foo" type="text" value="abc">
</form>
...
<script type="text/javascript">
alert("OK1");
eform = document.getElementById("eform");
alert("OK2");
</script>
調べてみると Mozilla も IE も
	<form id="eform" ...>
によって変数 eform が自動的に生成されているのだ。その内容は
	document.getElementById("eform")
と同じになっている。input タグについても同様である。この事は次のプログラムによって確認できる。

<form id="eform">
<input id="text" name="foo" type="text" value="abc">
</form>
<script type="text/javascript">
alert("OK1");
alert(eform);
alert(eform.foo.value);
alert(text1);
alert(text1.value);
alert("OK2");
</script>
これは正規のルールなのかどうかは知らない。正規のルールであれば利用できるし、そうでなければ注意しなくてはならない。

Javascript は文書化されていない事が多過ぎる!

補足1: Javascript のプログラム例の中で

	document.getElementById("bar")
のように getElementById() によって明示的にオブジェクトを変数に割り当てているものを非常に良く見かける。もしも bar の自動生成が正規のルールであれば、これ程使われる事はなかろう。他方ではメジャーなブラウザが暗黙にこの規則を使っているのであれば、その規則を受け入れる事とし
	if(typeof(bar) != "undefined") bar = document.getElementById("bar");
と何処かに書いておけば規則が統一されるはずである。なお、この部分は
	if(bar != undefined) bar = document.getElementById("bar");
ではダメである。なぜなら Javascript の論理式
	foo == undefined
が真だと言うのは、「foo が未定義」を意味しているのではなく、「fooundefined として定義されている」と言う意味である。従って foo にいかなる値(undefined を含めて)も割り当てられていない時の
	foo == undefined
は比較ができないのでエラーとなる。

補足2: Mozilla では getElemnentById() を使わないと「 W3C から外れている」とクレームを付けられる。従って

	eform = document.getElementById("eform")
でグローバル変数 eform に正式に値を割り振る事になる。他方 IE ではこれは問題を引き起こすのである。IE のはバグか?