0

我正在开发一个自定义 JS 缩略图转换器,它可以工作。我希望它无限期地循环缩略图。目前它一直持续到i==thumbs然后停止。以下是截取的代码:

for (var i = 1; i <= thumbs; i++) {
    timer[i] = setTimeout("Thumbchange('" + image_id + url + i + '.jpg' + "')", i * 100 * 10);
}

我想要的是,如果i到达thumbs(最后一个缩略图),重置i为 1 并for再次播放循环。但我无法让它工作。

我尝试了很多方法,包括以下内容,但由于超时,它使我的浏览器崩溃:我能以某种方式完全解决该超时问题吗?

for (var i = 1; i <= thumbs; i++) {
    timer[i] = setTimeout("Thumbchange('" + image_id + url + i + '.jpg' + "')", i * 100 * 10);

    if (i == thumbs) {
        i = 1; 
        clearTimeout(timer[i]); 
        continue;
    }
}
4

4 回答 4

0
while (i<=thumbs) {

    // do stuff before i increments

    if(i===thumbs) {
       i = 0;
    } else {
       i++;
    }

    // do stuff after i was
    // incremented

}

但请记住,以这种方式编写的循环将永远运行,因此会对性能产生很大影响。

于 2013-05-04T10:37:11.253 回答
0

请记住,它i永远不会达到值,>thumb因为这是循环的终止条件。

您的问题是在这种情况下:

if (i>thumbs)

将其更改为:

if(i == thumbs)

现在您的代码应如下所示:

for (var i=1; i<=thumbs; i++) {
    timer[i] = setTimeout("Thumbchange('" + image_id + url + i + '.jpg' + "')", i*100*10);
    if (i==thumbs) {
       i=1; 
       clearTimeout(timer[i]); 
       continue;
       }
  }
于 2013-05-04T10:38:37.703 回答
0

在无限循环中使用 asetTimeout是一种不好的做法,因为您最终会在短时间内创建数千个超时。这就是您的浏览器崩溃的原因。在(比方说)5 秒内,您最终创建(比方说)10000 次超时,而浏览器无法跟上,因此由于您消耗了太多内存而崩溃。

最好在最后一个超时后创建一个新的超时。

var i = 1;
var changeAfterTimeout = function () {
    i++;
    // check if we have finished the thumbnails. If so, start over
    if (i == thumbs) {
        i = 1;
    }
    Thumbchange(image_id + url + i + ".jpg");
    // call again after 5 seconds
    setTimeout(changeAfterTimeout, 5000);
}
changeAfterTimeout();

这样,在任何给定时间,我们只有一次超时运行。

于 2013-05-04T10:48:43.810 回答
0

或者使用setIntervalwhich 将自动循环永远或直到你清除它。请注意,setIntervalsetTimeout应该使用函数而不是评估字符串。

var img = 0;

Thumbchange (image_id + url + img + '.jpg'); // Initialise img 0
window.setInterval (function () {  // Invoked once per interval
  if (++img == thumbs) // inc image and reset to 0 when it reaches thumbs
    img = 0;
  Thumbchange (image_id + url + img + '.jpg'); // do image change
}, 1000);  // 1 second per image
于 2013-05-04T12:02:58.293 回答