2012-03-05 11 views
0

の要素のIDなしで私はJavaScriptでフェードアニメーションのための次のコードを持っているのsetTimeoutを呼び出す:問題はこのラインであるJavascriptを

var ticks = 20; 
function fadein(tick,element){ 
    if(element == null) 
     return; 

    element.style.opacity = tick/ticks; 
    if(tick < ticks) { 
     var s = "fadein(" + (tick+1) + "," + element + ")"; 
     setTimeout(s, 500/ticks); 
    } 
} 

var s = "fadein(" + (tick+1) + "," + element + ")"; 

は、要素は、その文字列表現に変換され、次の反復でエラーが発生します。私は、すべての要素がIDを渡してIDを持っていれば、私はこれを行うことができることを知っていますが、私は異なる時代に多くの異なるものをフェードインしたいので、それぞれに名前を付けたくありません。 jsでこれを行う方法はありますか?

答えて

2

setTimeoutを呼び出すために、文字列の代わりに無名関数を使用します。そうすれば、fadein関数内のすべての変数に簡単にアクセスできます。

これ以外にも、setTimeoutまたはsetIntervalに文字列パラメータを使用することは悪い習慣と考えられます。

var ticks = 20; 
function fadein(tick,element){ 
    if(element == null) 
     return; 

    element.style.opacity = tick/ticks; 
    if(tick < ticks) { 
     setTimeout(function() { fadein(tick+1, element); }, 500/ticks); 
    } 
} 
+0

'setTimeoutまたはsetIntervalを文字列パラメータで使用するのは悪い習慣と考えられます。どうして? – RobG

+1

@RobG MDNを引用するには:「eval()を使用するのと同じ理由でこの構文を使用することは推奨されません」(eval!を使用しないでください)(https://developer.mozilla.org/ja/JavaScript)/Reference/Global_Objects/eval#Don%27t_use_eval!) – Sirko

+0

クールです。フレーズ「悪い練習」や「ベストプラクティス」などを書いている場合は、常に理由を説明してください。 – RobG

0

あなたは純粋なJS

setTimeout(function(){.....}, 500/ticks); 
1

は、文字列の代わりに関数を使用してください...代わりに、文字列の関数を渡すことができます。

var f = function() { fadein(tick+1, element) }; 
window.setTimeout(f, 500/ticks); 

あなたは要素を送ることができますこの方法をパラメータを文字列表現にする必要はありません。

setTimeoutメソッドの文字列を使用することは、かつては唯一の方法でしたが、現在では関数を使用する方が良い方法と考えられています。