-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 毫秒动画之后发生的。到那时,'i' 变量的值已经改变,因为 for 循环将继续运行。

您可能只能在“动画”和延迟之前进行“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 回答