南極の図書館

ペンギンが寝ていた…。

初めてのJavaScript第二版 13章の例題をじっくりやってみる。 (前半)

初めてのJavaScript第二版 P283 13.3 オブジェクトのカプセル化
この例題を考える。


オフィシャルのサポートページだと13-5がカプセル化とあるが13-4が正しい。
例13-4 オブジェクト検出を用いた不透明度の設定:http://www.marlin-arms.com/support/ljs2/index13.php
(13-5は「コンストラクタチューンとapplyメソッドによる継承」が正しく、以降1つずつズレている。)

この例題の動作

・div1,div2にそれぞれ画像があり、初期値として片方は透明で、他方は不透明とする。
・画像をクリックする度に、透明だった画像は徐々に不透明に、不透明だった画像は徐々に透明にする。

※透明度の設定について

IEの透明度:
style="filter: alpha(opacity=0)"(透明)
style="filter: alpha(opacity=100)"(不透明)

mozilla,safari:		//IE8もこちらということだが試してない。
style="opacity=0"(透明)
style="opacity=1.0"(不透明)

この例題の目的

・メソッドを直接実装せず外部関数に実装する。(透明度を保持し、セットする関数DivObj)
・ブラウザ間の相違について、対応を別関数で作る。(関数getOpacity)
・上記を利用して、getElementByTagNameをした後にブラウザに関わる処理はラップ(覆い隠す)する。


では、以下の順番でやってみる。

1.初期化:画面を開いたときに透明度を0と1にする。
2.getとsetを書く。
3.getのブラウザ緩衝関数を書く。
4.setのブラウザ緩衝関数を書く。
5.メインの関数を作る。
6.足りないところを追加する。
7.動かなかった場合は修正する。

1.初期化:画面を開いたときに透明度を0と1にする。

<body onload="setup()">
<div id="div1" style="opacity: 1.0; filter: alpha(opacity=100)"><img 略 /></div>
<div id="div2" style="opacity: 0.0; filter: alpha(opacity=0)"><img 略 /></div>
として、

function setup(){
	theElements = document.getElementByTagName("div");
	for (i = 0; i < theElements.length; i++){	//良く使う形
		var obj = theElements[i];
		if(obj.id){
			theobjs[obj.id] = new DivObj(obj);	//対象オブジェクトを受け取りget/setするオブジェクトは別divObj(obj)にする。
		}
	
	}


};

2.getとsetを書く。

function DivObj(obj){
	this.obj = obj;
	this.objGetOpacity = getOpacity;	//getするにもブラウザ間の相違を緩衝しなければならないので、それをカプセル化
	this.objSetOpacity(value) = setOpacity(value);	//getと同じ意味で。※本書ではifで分岐させてるけど私はsetOpacity側で分岐させてみる。
};

3.getのブラウザ緩衝関数を書く。

function getOpacity(){
	if(this.obj.style.filter){
		var filterString = this.obj.style.filter;
		var derivedVad = filterString.substring(filterString.indexOf(':')+1, filterString.indexOf( ')' ));
		return derivedVal / 100;
	}else{
		return this.obj.style.opacity;	
	}
};

4.setのブラウザ緩衝関数を書く。

function setOpacity(value){
	if(this.obj.style.filter){
		var opacity = value *100;
		value.style.filter = "alpha(opacity:" + opacity + ")";  // alpha(opacity:90) などが入る。
	}else{
		value.style.opacity = value;	
	}
};

5.メインの関数を作る。

時間が無いのでここまで。


あとはメソッドとして
objSetOpacity(value)
objGetOpacity()
を持たせて終わりだと思うのだが、どうも今の時点で動かない気がしてきたのでここからは次回。
ここまで書いて見て、DivObjでsetを分岐させた方が素直な気がしてきた。


後半に続く。