setTimeout为循环添加+1" i"在经过的时间

时间:2013-03-28 15:14:33

标签: javascript jquery

我有3个顺序或下属下拉菜单,可以由用户选择(工作正常),或者在某些情况下,需要通过js选择。

我设置了一个超时,为js填充第一个下拉列表的时间,然后才能在序列中选择选项。否则它不起作用。

问题在于,在setTimeout经过的时间内,var“i”被添加了一个,这会抛出脚本。

如果在我只有一个输入要考虑的情况下强制“i”等于零,这将正常工作。由于这是动态的,我不能这样做,我正在寻找阻止这种行为的方法。

以下代码在第二个下拉菜单处停止。

在这种情况下,setTimeout是一个很好的解决方案吗? 感谢。

$( document ).ready(function() {
    var ctvid = <?php echo $ctvid ;?>;
    if(ctvid !=""){
    var info = <?php echo json_encode ($info);?>;
    for (var i=0;i<ctvid;i++){
        $('#brand' + i).val(info['brand_id'][i]).change();
            setTimeout(function(){
            $('#model' + i).val(info['model_id'][i]).change(); 
            },500); 
    }   
    }
});

2 个答案:

答案 0 :(得分:1)

i里面的setTimeout没有被捕获,你需要在自动执行匿名函数中手工创建一个闭包来创建一个闭包:

for (var i=0; i<ctvid; i++) {
    (function(i) {
        setTimeout(function() {
            $('#model' + i).val(info['model_id'][i]).change(); 
        },500); 
    })(i);
}
代码中的

i始终是每个元素的最后一个值。 Example fiddle here

答案 1 :(得分:0)

最好避免为这种情况使用时间,因为缓慢的连接很容易破坏它。在我看来,在“自动”情况下最好在元素(例如正文)上设置数据属性,您可以检查选择群体的完整功能。

澄清:

functionB()上,您根据selectA的选择使用元素填充selectB。在该功能中,检查是否设置了某些内容。如果是这样,使用它来选择刚刚填充的selectB中的项目,触发selectC填充。