2012-01-07 12 views
1

以下の関数でid1、id2、id3を渡したいと思います。jQueryで要素IDをSetTimeout関数に渡すには?

function doSomething(id1,id2,id3) { 
    $(id1).fadeIn('slow',.25); 
    $(id1).fadeIn('slow',.25); 
    $(id1).fadeIn('slow',.25); 
}; 

しかし、これは動作しません:これは正常に動作します

function doSomething(id1,id2,id3) { 
    setTimeout(" $(id1).fadeIn('slow',.25) ", 300); 
    setTimeout(" $(id1).fadeIn('slow',.25) ", 300); 
    setTimeout(" $(id1).fadeIn('slow',.25) ", 300); 
}; 

私は二番目の仕事を得るにはどうすればよいですか?私の考えは、私はIDの周りにいくつかの句読点が必要です。あるいは、関数の変数をsetTimeout括弧内に設定することもできます。何か案は?

答えて

5

setTimeout()に文字列を評価させることは悪い習慣です。代わりに、無名関数を使用します。私は1 setTimeout()にすべてのあなたのfadeIn() Sを入れている

function doSomething(id1, id2, id3) { 
    setTimeout(function() { 
     $(id1).fadeIn('slow', 0.25); 
     $(id2).fadeIn('slow', 0.25); 
     $(id1).fadeIn('slow', 0.25); 
    }, 300); 
}; 

注意を。タイムアウトがすべて同時に発生する(300ms)のと同じことをします。それは少し厄介ですが、$.add()はトリックを行うかもしれませんが

function doSomething(id1, id2, id3) { 
    setTimeout(function() { 
     $(id1 + ', ' + id2 + ', ' + id3).fadeIn('slow', 0.25); 
    }, 300); 
}; 

:あなたのIDが文字列であれば、あなたもこれを行うことができます。

3

setTimeoutは、関数コールバックとタイムアウトを受け入れます。関数呼び出しを引用符で囲むことで、文字列を渡します。これを試してみてください:

function doSomething(id1,id2,id3) { 
    setTimeout(function() { 
     $(id1).fadeIn('slow',.25); 
     $(id2).fadeIn('slow',.25); 
     $(id3).fadeIn('slow',.25); 
    }, 300); 
}; 

EDIT:@nnnnnnが指摘 として、文字列を渡すことができますが、それは悪いideaです。基本的に、文字列を渡すと、呼び出し元の権限で呼び出されるため、doSomething内のスコープ変数にアクセスすることはできませんが、全く異なるスコープになります。

+1

文字列を 'setTimeout'に渡すことは、本質的に間違っているわけではありません。これは確かに有効な構文です。文字列構文の問題は、文字列内のコードがローカルの 'id1'やその他のパラメータを使用するために適切なスコープで実行されないことです。 – nnnnnn

関連する問題