-1

「inputs」配列から入力フィールドをチェックするループが必要です。空のフィールドがある場合は、特別なダイアログをそれらの近くに表示する必要があり、ダイアログが表示された後、近くの入力フィールドにクラス「スタイル」を追加する必要がありますダイアログが表示された場合、ダイアログは次の空のフィールドに移動し、クラス「スタイル」を追加する必要があります。すべての空の入力がクラス「スタイル」を持つまで同様です。

問題は、ダイアログが表示された後のループで、クラス 'style' が配列の最後の要素にのみ追加されますが、その間に遅延があるすべての空の要素に追加する必要があることです。

これは私のループですが、私が言ったように、正しく機能していません:

for(i=0;i<inputs.length;i++){
var now = inputs[i];
var top = inputs[i].attr('top');
    if(!now.val()){
    if(dialog.css('display')=='none'){now.addClass('style');dialog.css('top',top).fadeIn(200);}
    else{dialog.delay(300).animate({"top": top}, 500, function(){now.addClass('style');});
    }else{now.removeClass('style');}}

PS私の英語でごめんなさい。

4

1 に答える 1

2

これは、「addClass」を呼び出している関数が 300 ミリ秒のアニメーションの後に発生しているためです。その時までに、for ループが引き続き実行されるため、変数 'i' の値が変更されています。

「animate」と遅延の前に「now.addClass」呼び出しを行うことができる場合があります。そうしないと、変数が上書きされないように、ループを中断してアニメーションの完了後に続行する必要があります。

これが私が話していたことの例です。以下のコードは、一度に 1 つの入力を処理し、現在の入力の処理が完了するまで次の入力に進みません (このコードはテストされていません)。

var offset = -1;

var inputs = (something goes here)

iterateInputs();

function iterateInputs()
{
    offset++;

if (typeof inputs[offset] != 'undefined')
{
    eachInput();
}
else
{
    // all done!
}
}

function eachInput()
{
var now = inputs[offset];
var top = inputs[offset].attr('top');
if (!now.val())
{
    if (dialog.css('display')=='none')
    {
        now.addClass('style');
        dialog.css('top', top).fadeIn(200, function(){
            iterateInputs();
        });
    }
    else
    {
        dialog.delay(300).animate({"top": top}, 500, function(){
            now.addClass('style');
            iterateInputs();
        });
    }
}
else
{
    now.removeClass('style');
    iterateInputs();
}
}
于 2012-10-08T15:26:24.350 に答える