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




