【问题标题】:problem with setInterval(); and clearIntervalsetInterval() 的问题;和清除间隔
【发布时间】:2010-07-28 14:06:38
【问题描述】:

我有一个涉及 setinterval 的问题。最好展示一个例子,所以这里有一个链接:

http://boudaki.com/testing/carouselTest

基本上,我无法按照我的需要进行这项工作。当页面加载时,内容每三秒旋转一次,右侧的编号按钮也会这样做。当您单击按钮时,按钮会扩展并且动画停止 - 一切都很好。然后,当您单击按钮底部的小关闭按钮时,动画会继续 - 一切都很好......但是当您再次单击编号按钮时,动画会继续进行。为什么?

代码比较多,但是 setIntervals 和 clear interval 是:

  • 第 69 行:在 document.ready 上启动动画关闭 - 将 timerId 分配给全局变量
  • 第 87 行:当用户单击该动画中的编号按钮 clearinterval 时
  • 第 102 行:当用户单击关闭按钮时,再次启动动画

就是这样......我只是不明白为什么它第二次没有停止动画???有谁知道为什么?

有什么想法吗?

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    这是一个猜测,但请尝试将所有函数和变量放入 $(document).ready(function() {...}) 调用中。

    然后更改您的setInterval(),以便您传递对函数的引用而不是用于 eval 的字符串:

    timerId = setInterval( rotateForward, 3000 );
    

    请务必全部更改。

    说实话,我不知道为什么会这样,但是将变量设为本地可能有助于确保我们只处理 一个 版本的timerId

    【讨论】:

    • 很确定这实际上不起作用,如果它不在引号中,它只会立即调用 rotateForward。
    • @Shawn - 实际上不是因为我已经删除了(),所以没有任何东西可以执行该功能。通过这种方式,它传递了对setInterval() 调用的函数的引用。就像你传递了一个匿名函数一样。
    • 谢谢帕特里克。我认为删除引号和括号并按照凯尔上面的建议进行操作。杰出的。感谢您的宝贵时间。
    • 啊,感谢您的澄清,这解释了我过去遇到的问题!
    【解决方案2】:

    $closeButton.click(function() { ... });在你的循环里面。该处理程序被添加了 4 次,因此当您单击关闭时,会添加 4 个计时器,而当您再次打开菜单时只会清除 1 个。

    【讨论】:

    • 是的,凯尔!就是这样。以为我已经尝试过了,但我认为将其与下面的 Patricks 答案结合起来就可以了!非常感谢 :)
    【解决方案3】:

    我认为问题在于 timerId 的范围。尝试更改警报('现在应该停止'); to alert('现在应该停止' + timerId);

    我打赌你会发现 timerId 总是相同的值。

    【讨论】:

      【解决方案4】:

      我唯一能想到的是...我很确定您不能将 () 放在 setInterval 调用中。一开始它似乎确实有效,但也许这是问题的一部分?很难说...但我至少会从那里开始。

      setInterval("rotateForward", 3000);
      

      另外,也许在每次启动之前尝试调用 clearInterval。

      【讨论】:

      • 这会引发错误,顺便说一句,请永远不要将字符串传递给setInterval(),如果可以避免的话,它好多更好,更不容易出错通过直接引用。
      • 很高兴听到这个消息,我知道这个功能有一些微妙之处,但是当我需要知道时,我从来没有时间真正弄清楚它们。感谢您的信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      相关资源
      最近更新 更多