2007年05月12日

getElementsByTagName

既にいない人のコードを修正するはめになり、今日そのコードを読んでいて、奇妙なことに気づきました。

function sample1() { var childs = $('parent').getElementsByTagName('input'); var s = ""; for (var k in childs) { s += k+ ' => ' + childs[k].value + '<br/>'; } $('result1').innerHTML = s; }

この様なコード(あくまでもサンプルです)だったのですが、IEでは期待通りの動きをするのに、それ以外のブラウザでは、おかしなことになります。

ちなみに期待通りの動きとは、上の例ですとresult1のdivに下記のように表示される事です。これが期待通りというのは、あくまでも私の予想です。というのもIEではちゃんと動くが、それ以外ではまるで動かないコードの原因だったからです。

child1 => value1 child2 => value2 child3 => value3 child4 => value4 child5 => value5

それでFirefoxでの出力を確認してみたわけです。

0 => value1 1 => value2 2 => value3 3 => value4 4 => value5

なんだか、読めてきました。
MDS DOM:element.getElementsByTagNameを見てみると、

Returns a list of elements with the given tag name.

とある。標準規格であるところのECMAScriptの定義を見てみると、

getElementsByTagName(tagname) このメソッドは NodeList を返す。tagname パラメータは DOMString 型である。

NodeListを見ると

Object NodeList NodeList オブジェクトは以下のプロパティをもつ。 length このプロパティは int 型である。 NodeList オブジェクトは以下のメソッドをもつ。 item(index)

どうやら、Mozillaのがちゃんとしているらしい。

そこで、MSのドキュメントを探してみると、なんだか同じ様な記述が。ということはと、

function sample2() { var childs = $('parent').getElementsByTagName('input'); var s = ""; for (i=0; i<childs.length; i++) { var k = childs[i].id; s += k + ' => ' + childs[i].value + '<br/>'; } $('result2').innerHTML = s; }

こんな風に直して実行してみると、IE、Firefox共に同じ動きをしました。ちなみにMacのSafariでも問題ありませんでした。

投稿者 iwazawa : 00:52 | コメント (0) | トラックバック