getElementsByClassName on Gecko2007年02月04日 14時29分

Gecko に Web Applications 1.0 の getElementsByClassName メソッドが実装されました (Bug 357450)。Firefox 3 から使用可能になります。document.getElementsByClassName で文書全体から、または element.getElementsByClassName である要素の子孫要素から、特定のクラス名を含む要素を探し出すことができます。

引数は空白文字区切りでクラス名のリストを表す文字列。複数のクラス名が指定された場合はそれらすべてを持つ要素のリストが返ります。現時点の Web Applications 1.0 仕様では、複数のクラス名を収めた配列も引数として使えることになっていますが、それは実装されていません (一口に「配列」といってもプログラミング言語ごとに実際のデータ構造が異なるから?)。

なお、返されるリストは「生きて」いる、すなわち、文書の変更に伴ってリストの内容も変化します。ですから、以下のコードは期待通り動きません。

var elements = document.getElementsByClassName("foo");
for (var i = 0; i < elements.length; i++)
  elements[i].className = "bar";

この場合、たとえば以下のようにする必要があります (またはリストの末尾からなめる、elements = Array.slice(elements, 0) として静的な配列にするなど)。

var elements = document.getElementsByClassName("foo");
while (elements.length)
  elements[0].className = "bar";

同様のことが XUL 文書、XUL 要素に対して使用可能な getElementsByAttribute メソッドにもいえます。(userChrome.js 用スクリプトを書いているときこれにはまりました。)

ところでこの記事のタイトルは「getElementsByClassName in Gecko」のほうが正しいのでしょうか? どうもそこら辺よくわかりません。