1

JavaScriptで次の機能を作成しようとしています。

$("mySelector").each(function(){

// Do something (e.g. change div class attribute)   
// call to MyFunction(), the iteration will stop here as long as it will take for myFunction to complete

});

function myFunction() 
{   
 // Do something for e.g. 5 seconds 
}

私の質問は、myFunction()の期間中、どのようにしてすべての反復を停止できるかということです。

4

3 に答える 3

3

いいえ、それは不可能です。おそらく.eachの現在のインデックスに基づくsetTimeoutを使用して、別の方法でコーディングする必要があります。

$("mySelector").each(function(i){

    // Do something (e.g. change div class attribute)   
    // call to MyFunction(), the iteration will stop here as long as it will take for myFunction to complete
    setTimeout(myFunction,i*5000);

});

function myFunction() 
{   
 // Do something for e.g. 5 seconds 
}

編集:キューイングでも実行できます:http://jsfiddle.net/9Bm9p/6/

$(document).ready(function () {
    var divs = $(".test");
    var queue = $("<div />");

    divs.each(function(){
        var _this = this;
        queue.queue(function(next) {
            myFunction.call(_this,next); 
        });
    });
});

function myFunction(next) {    
    // do stuff
    $(this).doSomething(); 

    // simulate asynchronous event
    var self = this;
    setTimeout(function(){
        console.log(self.id);
        // go to next item in the queue
        next();
    },2000);

}

</ p>

于 2012-09-12T20:31:16.143 に答える
2

これが私があなたが必要とすることをするだろうと思うjsFiddleです:

http://jsfiddle.net/9Bm9p/2/

セレクターを使用しているものに置き換えるだけです。

発生している「ループ」はmyFunction、次の要素に進む前に終了するのを待ちます。中にsetTimeoutを追加しmyFunctionて、一定の時間をかけてシミュレートしました。AJAXリクエストなどの非同期のものを使用している場合はmyFunction、メソッドの内部completeまたはアニメーションのコールバックに呼び出しを配置する必要があります。

しかし、誰かがすでにコメントしているように、すべてmyFunctionが同期している場合は、そのまま使用できるはずです。このプロセスを非同期にする場合、またはのプロセスがmyFunction非同期である場合は、forループまたは.each()を使用できません。

于 2012-09-12T21:06:47.167 に答える
1
(function () {
    "use strict";

    var step = 0;
    var content = $("mySelector");
    var max = content.length;
    var speed = 5000; // ms


    var handle = setInterval(function () {
        step++;
        if (step >= max) {
            clearInterval(handle);
        } else {
            var item = content[step];
            // do something
        }
    }, speed);
}());

setIntervalnミリ秒ごとに1回実行し、clearInterval終了すると停止します。これによってブラウザがロックされることはありません(「何かをする」こともロックされない場合)。 壊れやすい:$("mySelector")の結果がタスクの期間中有効であると想定します。そうでない場合は、内部で再度do something検証itemします。

于 2012-09-12T20:41:25.833 に答える