>>0
今さらながら、気になったので確認してみたけど、
> if (consent_year != "xx"){
これだと IE でも『期待通り』には動かないよね。最初の option 要素を選択してみれば、すぐ分かるかと。
HTML のフォームは、昔ながらの慣習が多くて面倒くさい。そして、HTML のフォームが廃れるまでは(いつになることやら)、以下の書き方をずっと引きずることになるだろう。
var c = document.forms[0].elements[0];
ページ中の、0 番目(最初)の form 要素の、0 番目(最初)のフォームコントロールを指す[*]。あるいは、
var c = document.forms['ID'].elements['NAME'];
ページ中の、「ID」という id 属性を持つ form 要素(ここで今さら name 属性なんて使っちゃ駄目だ)の中の、「NAME」という name 属性のフォームコントロール(ここでは name 属性を使う)を指す[*]。そんでもって、
// c が属している form 要素
c.form;
// c が属している form 要素中の、"NAME2" のコントロール
c.form.elements['NAME2'];
// c の value 属性値
c.value;
// c が select 要素の場合、選択中の option 要素の value 属性値
// c が textarea 要素の場合、その内容
残りは実戦で覚えていけば、まずは十分。
以下は読まなくて良い。
[*] DOM HTML 的にはdocument.forms.item (0).elements.item (0)
document.forms.namedItem ('ID').elements.namedItem ('NAME')だが、ECMAScript で使用する場合は [..] 記法が認められているので、document.forms[0].elements[0];
document.forms['ID'].elements['NAME'];
と書ける。さらに、[..] 内の文字列が ECMAScript の識別子としての条件を満たすなら、document.forms.ID.elements.NAME
のようにも書ける(数字で始まる文字列は識別子にならないので駄目……どの道、ID が数字で始まることはありえないわけだが)。さらに、JavaScript 1.0 からの慣習に従って、document.ID.NAME
のようにも書けるが、ここまで省略してしまうと document や HTMLFormElement 本来のプロパティとぶつかってしまい、好ましくない。さらに、これを逆手にとってdocument['ID']['NAME']
のように書く人もいるが、こうなるともうオブジェクトの構造がぐちゃぐちゃなので、止めてほしい。