【问题标题】:setInterval, clearInterval, setTimeout conflict messing up slideshowsetInterval、clearInterval、setTimeout 冲突搞砸幻灯片
【发布时间】:2013-11-22 23:01:27
【问题描述】:

我有一个幻灯片,可以在 document.ready 上自动播放,方法是触发我的左箭头单击 setInterval。我试图在单击导航箭头时停止自动播放,同时仍然允许箭头在幻灯片中导航。

这就完成了。

var intervalId = window.setInterval(switchLeft, 4000);

$("#leftarrow, #rightarrow").click(function() {
    window.clearInterval(intervalId);
});

但是如果箭头在 8 秒内没有被点击,我希望自动播放重新开始。我曾尝试通过将此 setTimeout 添加到 click 函数中来重新启用 setInterval,但它会计算暂停期间用户导航的所有点击次数,并开始疯狂地扔我的幻灯片。 (每次点击我都会移动两层图像。)

setTimeout(function() {
  intervalId = window.setInterval(switchLeft, 4000)
}, 8000);

我尝试将东西包装在 setTimeout 函数中,但我最终得到了不同的怪异。

感谢您的帮助, 查理马吉

【问题讨论】:

  • 请提供一个 jsfiddle 以便我们更轻松地帮助您

标签: javascript settimeout setinterval


【解决方案1】:

如果在触发之前单击箭头,则需要取消setTimeout(),这样您就不会同时启动多个计时器(这肯定会表现出怪异)。

我没有完全按照您在箭头上的操作,但这段代码应该管理计时器:

var intervalId = setInterval(switchLeft, 4000);
var timeoutId;

$("#leftarrow, #rightarrow").click(function() {

    // clear any relevant timers that might be going 
    // so we never get multiple timers going
    clearInterval(intervalId);
    clearTimeout(timeoutId);

    // restart the interval in 8 seconds
    timeoutId = setTimeout(function() {
        intervalId = window.setInterval(switchLeft, 4000)
    }, 8000);
});

【讨论】:

  • 你的例子和我的例子一样。 switchLeft 是我的函数,也是由左箭头触发的。它从右到左发送幻灯片。 switchRight 则相反。其中没有隐藏计时器。如果我点击右箭头几次,然后左箭头很快就会在整个地方来回移动,因为他们试图赶上点击和 setInterval。看着很有趣,但不是我需要的。我想我需要一种方法来停止点击的间隔,然后忽略 8000 的这个点击功能。
  • 也许像用 setTimeout 显示和隐藏的箭头顶部的透明 div 进行设置和清除?
  • @charliemagee - 我在代码中进行了一次更正(删除了您的原始代码所具有的var,因此它可以正确使用更高范围的变量)。这应该会有所帮助。如果您的 switchLeft 函数中也有动画,那么您可能还需要在 click 函数中停止该动画。这现在可以适当地管理这些计时器。如果您需要其他问题的帮助,您必须向我们展示其余代码。
  • jfriend00 -- 完美!如您所见,我仍然对变量的范围感到困惑。我的 switchLeft 和 switchRight 充满了动画,但看起来只有几个需要调整。非常感谢。顺便问一下,我的用户名前面的@符号是怎么得到的?我在 stackoverflow 常见问题解答中找不到它。
  • @charliemagee - 我只是手动输入“@”,然后输入您姓名的前几个字母,它会自动完成涉及此问题的人员。 @username 确保该人收到您的评论的通知,但回答者会自动收到有关其回答的任何 cmets 的通知,并且提问者会自动收到有关其问题的任何 cmets 的通知。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 2013-06-02
  • 1970-01-01
相关资源
最近更新 更多