从for循环javascript设置多个超时

时间:2014-01-14 11:26:02

标签: javascript jquery

我想从for循环中设置8个超时。我有jquery id:ir1,ir2 ...,ir8。为什么以下不起作用:

        var i = 1;
        for (i; i<9; i++ ){
            setTimeout( $('#ir'+i).hide(),100*i);
        }

3 个答案:

答案 0 :(得分:1)

http://jsbin.com/OrUVoRi/1/edit

  var i = 0, elements = [];
  //save jquery calls for performance reasons
  for (i = 0; i<9; i++){
    elements[i] = $('#ir'+i);  
  }
  //you can make this function custom
  var hide = function(i){
    elements[i].hide();
  };
  //the callback loop
  for (i = 0; i<9; i++){
    //bind i value to the hide function
    setTimeout( hide.bind(this, i), 1000*i );
  }

答案 1 :(得分:0)

你的问题很模糊:我会解释:

乍一看,你有一个关闭问题:

解决方案:

 var i = 1;
    for (i; i<9; i++){
        (function(a){
            setTimeout(function(){
                $('#ir'+a).hide();
            },1000*a);
        })(i);
    }

此外,由于所有超时都在突发中执行 - 您添加了更长的延迟:100*i;

在其他解决方案中 - 这是我的:http://jsbin.com/EpaceSaJ/5/edit

不同之处在于,在您的情况下 - 无论内部代码的执行如何,函数都将精确地为100 * i 而在我的解决方案中:超时将在上一次操作的每个结束后开始。

(function g(i,max){

   setTimeout(function   ( )
   {
       console.log(i); // <-- put your stuff here
      if (i==max) return false;
       g((++i),max);
   }, 1000); 
})(1,3); // <--loop  values from 1 to 3 (9 at your case)

答案 2 :(得分:0)

setTimeout()应该是

setTimeout(function(){
   $('#ir'+i).hide()
},100*i);

更新

正如@royi namir所提到的,问题是因为闭包(范围),调用自调用函数,传递i作为参数,将超时值增加到1000 ......仅作为示例

  var i = 1;
    for (i; i<9; i++){
        (function(a){
            setTimeout(function(){
                $('#ir'+a).hide();
            },1000*a);
        })(i);
    }

fiddle