【问题标题】:variable timer with setTimeout() inside jQuery .eachjQuery .each 中带有 setTimeout() 的可变计时器
【发布时间】:2017-03-26 16:07:21
【问题描述】:

我想以幻灯片的形式循环播放一堆 jpg 图片。到目前为止,我一直在成功使用 setInterval。但是,我现在想让每个幻灯片放映自定义时间。例如幻灯片 1 显示 6 秒,然后幻灯片 2 显示 3 秒,等等。我尝试了以下代码:

var sl = [["PodLoop1.jpg", 6000], ["PodLoop2.jpg", 3000]];
$.each(sl, function(i, value) {
    fl = '<img src="media/' + value[0] + '" height="100%">'
    setTimeout(function(){
        $("#InnerMedia").html(fl);
        if (i >= sl.length) {
            window.location.href = "./media.php"; // refresh to restart from the beginning
        }
    }, value[1])
});

但这不起作用。它只是跳到列表中的最后一张幻灯片。我究竟做错了什么?我看过几个关于 SO 的类似问题,例如 this one,但似乎没有一个涉及可变计时器。

【问题讨论】:

    标签: javascript jquery timer settimeout


    【解决方案1】:

    i 永远不会相等 sl.length 把代码改成i &gt;= sl.length-1

    【讨论】:

    • 好点。我错过了。 +1 :-) 但这是部分答案,因为用户希望链接事件。
    【解决方案2】:

    您的问题是您正在使用.each 循环。

    设置超时

    setTimeout 的作用是在指定时间注册一个事件。现在,当您在循环中运行它时,这将注册 2 个事件,1 个在 3 秒后,另一个在 6 秒后。所以它运行正常。

    要解决此问题,您必须对这些setTimeouts 进行链式初始化。您必须在另一个事件中注册新事件。

    示例

    function createTimeout(arr, index){
      if(!arr[index] == undefined) return;
      setTimeout(function(){
        console.log(arr[index][0]);
        createTimeout(arr, ++index)
      }, arr[index][1])
    }
    
    var sl = [["PodLoop1.jpg", 6000], ["PodLoop2.jpg", 3000]];
    createTimeout(sl, 0);

    【讨论】:

    • 当我有更长的列表时,递归不是问题吗?
    • if(!arr[index] == undefined) return; 将确保它不会进入无限循环
    • 我指的是我有 100 个文件的状态(比如说)内存使用量会很大!因为递归...
    • @Chiwda 否。您正在将引用和索引传递给函数。所以它不会产生那么大的影响。
    • this answer,尤其是最后关于内存的讨论。
    猜你喜欢
    • 2012-02-06
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2021-06-08
    • 2013-09-27
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多