Insertion.Topクラス
【抜粋】 Insertion.Top = Class.create(); Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { initializeRange: function() { this.range.selectNodeContents(this.element); this.range.collapse(true); }, insertContent: function(fragments) { fragments.reverse(false).each((function(fragment) { this.element.insertBefore(fragment, this.element.firstChild); }).bind(this)); } });
基準要素内の先頭に要素を挿入するクラスです。インスタンス作成時に処理が行われ、各メソッドは外部から使用されることはありません。
Abstract.Insertionクラスの引数に'afterBegin'を設定してインスタンスを生成、継承しています。
initializeRangeメソッド
this.rangeはRangeオブジェクトです。selectNodeContentsメソッドにより、基準要素を選択後、collapseメソッドで上に折りたたみます。これにより基準要素内の先頭を指すことができます。Mozilla系ブラウザでcreateContextualFragmentメソッドを使うための準備です。
insertContentメソッド
引数fragmentsが、挿入する要素オブジェクトを格納しているArrayオブジェクトなのは前述Insertion.Beforeクラスと同じです。これを一度reverseメソッドで逆順に並び替え*1、それから基準要素内の最初の子要素の直前に、順に挿入しています。
【例】 <html> <head> <title></title> <style> <!-- div, table, td{ border:solid blue 2px; margin:5px; padding:5px; } --> </style> <script language="javascript" src="prototype.js" charset="utf-8"></script> <script> <!-- var counter = 0; function test(){ var blue = (255 - counter*20); blue = (blue < 0) ? 0 : blue; var color = "rgb(255, 255, " + blue + ")"; var str = "<div>BBBB<div>" + counter + "</div></div>" + "<script>" + "$('test').style.backgroundColor = '" + color + "';" + "counter++;" + "</script>"; new Insertion.Top('test', str); new Insertion.Top('tbody', "<tr><td>ADD</td><td>" + counter + "</td></tr>"); } //--> </script> </head> <body> <div id="test">AAAA</div> <table> <tbody id="tbody"> <tr><td>CELL</td><td>CELL</td></tr> </tbody> </table> <button onclick="test();">TEST</button> </body> </html>
前述Insertion.Beforeクラスの例とほぼ同じですが、こちらはTESTボタンで基準要素内の先頭に追加します。また、tbody要素を対象として、テーブルの先頭へ行追加ができます。table要素ではないので注意してください。ただ、Operaでうまくいかないみたいです。詳しいことが分かったら追記します。*2
*1:reverseメソッドはオーバーライドされている。引数falseで元の配列を並び替える
*2:Operaではカウンタが上がらない不具合があります。Insertion.Beforeクラス - Backstage of theater.js参照