在Javascript中每五秒循环一次

时间:2015-02-24 14:04:08

标签: javascript jquery loops delay settimeout

我试图在JS(或JQuery)中编写一个简单的循环,每隔五秒更新一次图像,总共15秒(所以三个循环),然后退出。

它应该是这样的:

  1. 等五秒钟
  2. 执行
  3. 等五秒钟
  4. 执行
  5. 等五秒钟
  6. 执行
  7. 退出
  8. setTimeout似乎只运作一次。

    作为测试,我尝试过:

    function doSetTimeout(i) {
      setTimeout(function() { alert(i); }, 5000);
    }
    
    for (var i = 1; i <= 5; ++i)
      doSetTimeout(i);
    

    不起作用:http://jsfiddle.net/ubruksco/

    我也尝试过:

    for(var i = 1; i <= 5; i++) {
        (function(index) {
            setTimeout(function() { alert(index); }, 5000);
        })(i);
    }
    

    不起作用:http://jsfiddle.net/Ljr9fq88/

8 个答案:

答案 0 :(得分:13)

var time = 1;

var interval = setInterval(function() { 
   if (time <= 3) { 
      alert(time);
      time++;
   }
   else { 
      clearInterval(interval);
   }
}, 5000);

你可以简单地创建一个间隔并在第3次之后将其杀死

答案 1 :(得分:3)

原因是你的settimeout在同一时间(5秒后)结束,因为你的超时代码是基于5秒

for(var i = 1; i <= 5; i++) {
    (function(index) {
        setTimeout(function() { alert(index); }, 5000);
    })(i);
}

您要做的是根据您的索引更改超时时间(因此会有不同的开始时间。

for(var i = 0; i < 3; i++) {
    (function(index) {
        setTimeout(function() { alert(index); }, index*5000);
    })(i);
}

(还需要3次迭代,因此为你编辑循环)

答案 2 :(得分:2)

轻松一点!你不需要循环,你只需要三次执行。

setTimeout(function() { alert(1); }, 5000);
setTimeout(function() { alert(2); }, 10000);
setTimeout(function() { alert(3); }, 15000);

但是,如果你真的想要一个循环:

function doSetTimeout(i) {
    setTimeout(function() { alert(i); }, i*5000);
}
for (var i = 1; i <= 3; ++i)
    doSetTimeout(i);

答案 3 :(得分:1)

假设您正在使用jQuery(操纵DOM),

你可以试试这个:

['img1.jpg', 'img2.jpg', 'img3.jpg'].forEach(function(imgPath, index) {
    // the callback will be executed in 5seconds * (index + 1)
    setTimeout(function() {
       // change image source
       $('img#myImage').attr('src', imgPath);
    }, 5000 * (index + 1));
});

答案 4 :(得分:1)

使用setTimeout:

function doSetTimeout(i) {
    if(i >= 3) return;
    alert(i);
    setTimeout((function () {
        return function () {
            doSetTimeout(i);
        };
    })(i + 1), 5000);
}

doSetTimeout(0);

但你也可以使用setInterval,也许更合适。

答案 5 :(得分:1)

您可以使用setInterval代替并跟踪您执行功能的次数。而不仅仅是使用clearInterval()来停止执行。

var i = 1;
var interval = setInterval(function() {
  execute();
}, 5000);

$(document).ready(function() {
  execute();
});

function execute() {
  $("#output").append("set<br/>");

  if (i == 3) {
    clearInterval(interval);
  }
  i++;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='output'></div>

如果您想先等待5秒,请勿在domready上致电execute()

答案 6 :(得分:1)

你的第一个例子就在那里。您只需要将时间延迟乘以循环索引即可获得正确的延迟。

function doSetTimeout(i) {
  setTimeout(function() { alert(i); }, 5000*i);
}

for (var i = 1; i <= 3; ++i)
  doSetTimeout(i);

http://jsfiddle.net/ubruksco/3/

答案 7 :(得分:0)

你想要setInterval()而不是

 setInterval(function(){ alert("Do Something"); }, 3000);