You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

setInterval时间取值异常:iframe循环展示时长始终为数组首个元素值

问题分析与解决方案

你的问题核心在于setInterval的工作机制:当你调用setInterval时,它的时间参数会立即求值并固定下来。初始化时i的值是0,所以这个间隔会一直是time[0](也就是10000ms),后续i的更新不会影响这个已经确定的间隔时长。

要解决这个问题,我们可以改用递归调用setTimeout的方式,这样每次都能根据当前的索引获取对应的展示时长,动态设置下一次的延迟:

$(function() { 
    var urls = ['/uploads/presentations/1560837902.pdf', '/uploads/presentations/1560837925.mp4', '/uploads/presentations/1560837959.jpg', '/uploads/presentations/1560838138.docx', '/uploads/presentations/1560838215.ppt']; 
    var time = [10000, 40000, 10000, 20000, 10000]; 
    var i = 0; 

    function loadIframe(url) { 
        $('#iframe').attr('src', url); 
    }

    function cycleContent() {
        // 更新索引,实现循环
        i = (i + 1) % urls.length;
        loadIframe(urls[i]);
        // 根据当前索引对应的时长,设置下一次内容切换的延迟
        setTimeout(cycleContent, time[i]);
    }

    // 初始化加载第一个内容
    loadIframe(urls[i]);
    // 启动循环:第一次切换的延迟对应第一个内容的展示时长
    setTimeout(cycleContent, time[i]);
});

关键说明:

  • setTimeout是单次延迟调用,每次切换内容后,我们都会根据当前i对应的time值重新设置下一次的延迟,这样就能保证每个内容都严格按照设定的时长展示。
  • 初始化逻辑先加载第一个内容,再根据它的时长设置第一次切换的延迟,完全匹配你的循环展示需求。

内容的提问来源于stack exchange,提问作者Debajeet Choudhury

火山引擎 最新活动