無名関数が正しく動作しない

[新着] Webテンプレートを仮オープンしました



0   名前: うひょ : 2007/06/01(金) 16:18  ID:MwRz11Hy sub-bK
function imgset(){
	var a = document.getElementsByTagName('img');
	for(var b=0;b<a.length;b++){
		a[b].onclick = function (){document.body.style.backgroundImage="url("+a[b].src+")"; };
	}
}
上記は、onload時に画像をクリックすると背景画像をその画像に変更するスクリプトなのですが、
a[b].srcが無いと言われます。
無名関数を作成した場合、「a[b].src」などはファイル名にならずに関数の実行時にファイル名になるのでしょうか?
また、どのような対策をとればいいでしょうか。
よろしくお願いします。

1   名前: NullPo : 2007/06/01(金) 16:18  ID:VyJTFwOo sub-.G
new Function()で。

2   名前: 匿名 : 2007/06/01(金) 16:18  ID:cQhnFJ0S sub-Cz
無名関数は「正しく」動作している。それが実行されるときには、ループはとっくに終わっていて、b == a.length になっているでしょ。a[b] == a[a.length] == null だから、(null).src が存在するはずがない。

レガシーな onclick ハンドラを使うのであれば this 参照が使えるんだから、
a[b].onclick = function () {
    document.body.style.backgroundImage = 'url("' + this.src + '")';
};

と書けば良い。

あと、今回のはメモリリークパターンではないのだが、うっかりリークさせないよう、imgset() 内で使用した全変数を最後に null にすることを勧めておく。IE6 が消え去るまでは、ノード参照を持つ関数内で関数を定義するときには細心の注意を(その意味では、スコープがグローバルになる Function() での構築も確かにアリだ)。

3   名前: うひょ : 2007/06/01(金) 16:18  ID:MwRz11Hy sub-bK
ありがとうございます。
無事解決しました。
今回は匿名様のスクリプトを参考にさせて頂きますが、
Function()のことも頭に入れておきたいとおもいます。

一覧へ戻る