9

jQueryを使用して、いくつかの要素にタイマーまたはインターバルループを設定し、数秒ごとにチェックしています。タイマーを設定して再起動する必要があるかどうかを確認したり、タイマーを設定して間隔を空けたり、停止する必要があるかどうかを確認したりしました。

単純化されていますが、これは基本的に私が必要とするものです:

var mytimers = new Array();
$('div.items').each(function() {
    myID = $(this).attr('id');
    mytimers[myID] = setInterval( function() { myFunction(myID) } , 3000)
});
function myFunction(param) {
    alert(param);
    if (something()) {
        clearInterval(mytimers[param]);
    }
}

クラス アイテムの ID は、id_1、id_2、id_3 です。しかし、id_3 を指定する 3 つのアラートを受け取るだけです。私のコードでは、「this」を渡そうとすることから始めましたが、問題を理解するために単純化を続けました。

変数を毎回新しいアドレスにコピーするにはどうすればよいですか? クロージャーを使用する必要があることはわかっています。何があっても他の変数を参照しているようです。

次のようなタイマーを使用してループに単純化してみました。

function tester(item) {
    return function() {
        alert(item);
    };
}
for(x=1;x<=3;x++) {
    setTimeout( '(function() { tester(x) })(x)' , 3000);
}

しかし、私は自分の問題を悪化させているだけだと思います。それは何もしていないようです.

以前の質問を検索しましたが、ほとんどは特定の問題を切り詰めるのではなく、大量の余分なコードで満たされ、他の方法で解決されています。この例を機能させることで、これがどのように機能するかを理解したいと思います。これを書いている間に、補助機能でタイマーをオフにできることがわかりました。

function tester(item)
    alert(item);
function myTimer(item)
    setInterval( function() { tester(item); }, 3000);
for(x=1;x<=3;x++)
    myTimer(item);

それなしでどうやってこれを行うことができますか?何か良い方法はありますか?

4

3 に答える 3

4

無名関数に対してローカルな変数 'myID' を持ち、

var myID = $(this).attr('id');
于 2010-07-20T20:32:00.880 に答える
3

each を使用するとクロージャーになります。関数スコープで変数をプライベートにするために var を忘れてしまいました

var mytimers = new Array();
$('div.items').each(function() {
    **var** myID = $(this).attr('id'); 
    mytimers[myID] = setInterval( function() { myFunction(myID) } , 3000)
});
function myFunction(param) {
    alert(param);
    if (something()) {
        clearInterval(mytimers[param]);
    }
}
于 2010-07-20T20:34:36.833 に答える
1

myFunction一致した各要素を 3 秒ごとに実行したいですか?

これを試して:

$('div.items').each( myFunction(this) );

var myFunction = function(elem) {
    return function() {
        if ( something(elem) ) {
            //return or do something with elem
        } else {
            window.setTimeout( myFunction(elem), 3000 );
        }
    }
};

の条件something()が満たされた場合は完了です。そうでない場合、関数は以前と同じ要素で 3 秒後に再び実行されるようにスケジュールされます。これは、異なる要素で何度でも呼び出すことができ、各呼び出しには独自のelem.

私は elem のようなオブジェクトを渡し、可能な限り最後の瞬間までそれらの内部での作業を遅らせることを好みます。idsomething()などについて心配する必要はありません。

連想配列を使用した他の体操 ( をnew Array()使用する代わりに{})、clearIntervalまたは ID は必要ありません。

マリムトゥが言ったように、実際にソリューションに対処するにはvar、 の宣言を省略しましたmyID。これは、そのグローバルを意味し、反復ごとに上書きされます。その結果、クロージャーを介して一意のローカルを取得する代わりに をsetInterval呼び出すと、すでに何度も上書きされたグローバルなものが取得されます。myFunctionmyID

于 2010-07-20T20:45:05.990 に答える