代码之家  ›  专栏  ›  技术社区  ›  Cofey

如何在for循环中使用setInterval或setTimeout?

  •  2
  • Cofey  · 技术社区  · 14 年前

    我试图在一些代码运行时设置一个间隔,但只需要根据元素的数量来设置。下面是一个简单的例子:

    5个总元素

    对于找到的每个元素,每20秒运行一次代码。

    有人能给我一个简单的例子,如何使用普通的javascript?我所做的一切只是一次性执行所有代码,而不是一次执行一个元素。

    4 回复  |  直到 14 年前
        1
  •  3
  •   fcalderan    14 年前

    假设您在谈论数组或dom集合的元素

    (function() {
       var arr = [...],
           len = arr.length;
    
    
       (function doProcess() {
           if (len--) {
               /* do something with arr[len] */
               setTimeout(doProcess, 20000);
           }
       })();    
    })();
    

    编辑: 如果由于任何原因无法反转数组,请使用下一个版本

    (function() {
       var arr = [...],
           len = arr.length;
    
    
       (function doProcess(i) {
           if (i) {
                console.log(len - i);
               /* do something with arr[len - i] */
               setTimeout(function() { doProcess(--i); }, 20000);
           }
       })(len);    
    })();
    
        3
  •  0
  •   bozdoz    14 年前

    下面是我使用jquery为图像设置动画所做的一些代码:

    var enter = 500;
    var show = 4000;
    var exit = 300;
    var direction1 = "right"; 
    var direction2 = "left";
    var logo = document.getElementById('Box1').getElementsByTagName('img');
    var Num = $('#Box1 img').length;
    var time_each = (enter+show+exit);
    function startBox1(){
    for(x=0;x<=Num-1;x++){
    Box1(x);
    }
    }  
    function Box1(x){
    var buffer = time_each*x;
    $(logo[x]).delay(buffer).show("slide", { direction: direction1 }, enter).delay(show).hide("slide", { direction: direction2 }, exit);
    }
    $(function(){
    startBox1();
    setInterval("startBox1()",(time_each)*Num);
    });
    

    技巧是设置一个缓冲区,该缓冲区等于当前动画索引为每个动画所花费的时间。这个 FOR 循环立即运行每个代码;循环 .delay() 动作和缓冲区变量使其看起来好像每个动画都是一个接一个发生的。然后 setInterval() 回忆 为了 每次动画完成后循环。它连续地重新启动进程。

        4
  •  0
  •   Ben Lee    14 年前

    您必须定义一个函数,在函数内部它需要设置一个超时。这样地:

    var els = [1, 2, 3, 4, 5];
    
    ((function process_els(el_index) {
      var el = els[el_index];
    
      // do stuff to el here
      console.log(el);
      // do stuff to el above
    
      if (el_index + 1 < els.length) {
        setTimeout(function() { process_els(el_index + 1); }, 20000);
      }
    })(0);