Insertion.Beforeクラス

【抜粋】
Insertion.Before = Class.create();
Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
  initializeRange: function() {
    this.range.setStartBefore(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.parentNode.insertBefore(fragment, this.element);
    }).bind(this));
  }
});

基準要素の直前に要素を挿入するクラスです。インスタンス作成時に処理が行われ、各メソッドは外部から使用されることはありません。

Abstract.Insertionクラスの引数に'beforeBegin'を設定してインスタンスを生成、継承しています。

initializeRangeメソッド

this.rangeは親クラスAbstract.Insertionのinitializeメソッドで作成されるRangeオブジェクトです。setStartBeforeメソッドにより、開始位置を要素の直前に設定します。Mozilla系ブラウザでcreateContextualFragmentメソッドを使うための準備です。

insertContentメソッド

引数fragmentsはinitializeメソッド*1内で、contentFromAnonymousTableメソッドにより作成されるか、もしくはRagenオブジェクトのcreateContextualFragmentメソッドにより作成されます。どちらもArrayオブジェクトで、挿入する要素オブジェクトが格納されています。このため、eachメソッドが使えます。基準要素の親要素からinsertBeforeメソッドを使用して、引数の配列fragmentsの各要素を、基準要素の直前に順に追加しています。bindメソッド*2は、クロージャ内でthisを有効にするために使用されています。

【例】
<html>
<head>
<title></title>
<style>
<!--
div{
  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.Before('test', str); 
}
//-->
</script>
</head>
<body>
<div id="test">AAAA</div>
<button onclick="test();">TEST</button>
</body>
</html>

TESTボタンで基準要素の直前に追加します。追加するごとに子要素のカウンタをアップしています。また、スクリプトタグで基準要素の背景を少しずつ黄色にしています。*3

テーブル途中の行追加は、tr要素を対象とすることで可能です。v1.4.0では、IEでtr要素を対象とすることができません。v1.5.0以降では対象となります。>>こちら<<を参照してください。

テーブル先頭への行追加は次のInsertion.Topクラスを使用します。

*1:親クラスAbstract.Insertionのinitializeメソッド

*2:前述Functionクラスの追加メソッド

*3:Operaではカウンタが上がらない不具合があります。原因はStringクラスに対する拡張」で追加されているevalScriptsメソッドです。v1.4.0の不具合です。正式リリースでない最新v1.5.0_rc0では改善されています。