僕はまだ 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
が未定義」を意味しているのではなく、「foo
は undefined
として定義されている」と言う意味である。従って foo
にいかなる値(undefined
を含めて)も割り当てられていない時のfoo == undefinedは比較ができないのでエラーとなる。
補足2:
Mozilla では getElemnentById()
を使わないと「 W3C から外れている」とクレームを付けられる。従って
eform = document.getElementById("eform")でグローバル変数
eform
に正式に値を割り振る事になる。他方 IE ではこれは問題を引き起こすのである。IE のはバグか?