fieldset要素はelements配列で取得される
入力フォームが設置された古いWebページの改修をやっていて引っかかる。
元のHTMLでは、form要素内に、inputやtextareaなどの操作する要素しか設置されていなくて、
それらをJavaScriptで以下のように取得していた。
for(var i = 0; i < form.elements.length; i++) { form.elements[i]....(do something) }
で、このHTMLはtableレイアウトで組まれていたので、
XHTML+CSSで組み直したときに、
fieldset要素とかを使ってがんばってマークアップしたんだけど、
同じJavaScriptを適用したところ、ループのところでエラーが出るようになった。
例えば、こんな感じのHTML:
<form method="post" name="form1" action="#"> <fieldset> <legend>フォームテスト</legend> <label for="input01">input01</label><input type="text" name="input01" /> <input type="checkbox" name="check01" /><label for="check01">check01</label> </fieldset> <input type="submit" name="btn_submit" value="submit" /> </form>
該当箇所はtype属性を取得していたところで、
form.elements[i].type is undefined
などと、Firebugで表示される。
alert(form.elements[i].type);
とすると、
undefined
text
checkbox
submit
と出てくる。
alert(form.elements[i]);
とすると、
object HTMLFieldSetElement
object HTMLInputElement
object HTMLInputElement
object HTMLInputElement
と出てくる。
というわけで、
fieldset要素は、elements配列で取得される、ということが確認できた。
legend要素は取得されていない。
fieldset要素にtype属性は指定していないから、
undefined
になる。
fieldset要素についてはこちらを参照:
type属性はない。
ここで、
alert(form.elements[i].getAttribute("type"));
としてみると、
null
text
checkbox
submit
となる。
なので、
for(var i = 0; i < form.elements.length; i++) { if(form.elements[i].getAttribute("type") != null){ if(form.elements[i].getAttribute("type") == text) { (do something) } } }
という感じで条件をつけると、とりあえずエラーは回避できる。