document.getElementsByClassNameメソッド
やっと半分まできました^^;
申し訳ありませんが、以降は逐行の解読ではなく、ポイントのみの記述とさせてください。ここまでのすべてを理解された方なら、問題ないと思います。
【抜粋】 document.getElementsByClassName = function(className, parentElement) { var children = ($(parentElement) || document.body).getElementsByTagName('*'); return $A(children).inject([], function(elements, child) { if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) elements.push(child); return elements; }); }
documentオブジェクトにメソッドを追加しています。CSSクラス名で要素を取得するメソッドです。第一引数がクラス名、第二引数が検索する親要素です。指定しないと全体(body)を検索します。その後、該当する要素の配列を返却します。
あ、getElementsByTagNameってワイルドカード使えるんですね・・・。
injectメソッドは、ArrayクラスがEnumerableクラスから継承したものです。見慣れないと何をやっているか分かりにくいですが、使えるようになると非常に便利です。
【例】 <html> <head> <title></title> <script language="javascript" src="prototype.js" charset="utf-8"></script> <script language="javascript"> <!-- function init(){ var str = ""; var wk; //全体からclassAの要素を取得 wk = document.getElementsByClassName("classA"); //ID表示用文字列作成 wk = wk.collect(function(value){return value.id}); str += "body/classA:" + Object.inspect(wk) + "<br/>"; //parent1要素以下からclassAの要素を取得 wk = document.getElementsByClassName("classA", "parent1"); //ID表示用文字列作成 wk = wk.collect(function(value){return value.id}); str += "parent1/classA:" + Object.inspect(wk) + "<br/>"; //表示 $('test').innerHTML=str; } //--> </script> </head> <body onload="init();"> <div id="test"></div> <div id="parent1"> <div id="child11" class="classA"></div> <div id="child12" class="classA"></div> <div id="child13" class="classB"></div> <div id="child14" class="classB"></div> </div> <div id="parent2"> <div id="child21" class="classA"></div> <div id="child22" class="classA"></div> <div id="child23" class="classB"></div> <div id="child24" class="classB"></div> </div> </body> </html>
【上記例の実行結果】 body/classA:['child11', 'child12', 'child21', 'child22'] parent1/classA:['child11', 'child12']