2010-07-28 103 views
4

我有一個涉及setinterval的問題。這也可能是最好的展現一個例子所以這裏是這裏的鏈接:使這項工作setInterval()的問題;和clearInterval

http://boudaki.com/testing/carouselTest

基本上我有問題,像我需要它。當頁面加載時,內容每三秒旋轉一次,右側的數字按鈕也會這樣做。當你點擊一個按鈕時,按鈕會延伸並停止動畫 - 這一切都很好。然後,當您點擊按鈕底部的小關閉按鈕時,動畫會重新開始 - 一切正常......但是當您再次單擊編號按鈕時,動畫會繼續進行。爲什麼?

有相當大量的代碼,但setIntervals和明確的間隔是:

  • 線69:上的document.ready啓動動畫關閉-assign的timerId一個全局變量
  • 87行:當在該動畫的編號按鈕clearinterval用戶點擊
  • 線102:當用戶點擊關閉按鈕啓動動畫再次

就是這樣....我只是不明白爲什麼它不會第二次停止動畫???任何人都能看到爲什麼

任何想法?

回答

1

$ closeButton.click(function(){...});在你的循環中。該處理程序將被添加4次,因此當您單擊關閉時,會再次打開菜單時添加4個定時器並僅清除1個定時器。

+0

是的凱爾!就是這樣。以爲我試過了,但我認爲將它與帕特里克的答案結合起來就可以了! 非常感謝:) – 2010-07-28 14:58:07

3

這是一個猜測,但請嘗試將所有函數和變量放入$(document).ready(function() {...})調用中。

然後改變你的setInterval()讓你在一個引用傳遞給函數,而不是字符串的EVAL:

timerId = setInterval(rotateForward, 3000); 

一定要改變他們。

說實話,我不知道爲什麼會工作,但使局部變量可能有助於確保我們正在處理的只有一個版本的timerId

+0

很確定,實際上它不會起作用,如果它不在引號中,它會立即調用rotateForward。 – 2010-07-28 14:29:47

+1

@Shawn - 實際上它不會因爲我已經移除了'()',所以沒有任何東西可以執行這個函數。這樣它就傳遞了一個對由'setInterval()'調用的函數的引用。就像你傳遞了一個匿名函數一樣。 – user113716 2010-07-28 14:32:54

+0

謝謝帕特里克。我認爲,除了引用和偏執之外,並且按照凱爾所建議的方式,它可以發揮作用。輝煌。謝謝你的時間。 – 2010-07-28 14:59:07

0

我能想到的唯一的事情是......我敢肯定你不能把()放在setInterval調用中。它似乎起初工作,但也許這是問題的一部分?很難說......但我至少要從那裏開始。

setInterval("rotateForward", 3000); 

此外,也許可以嘗試每次啓動之前調用clearInterval。

+1

這會拋出一個錯誤,因爲如果你可以避免的話,永遠不要向'setInterval()'傳遞一個字符串,它會更好,更不易錯誤地傳遞直接引用。 – 2010-07-28 14:34:43

+0

很高興聽到這個消息,我知道這個函數有一些微妙之處,但是當我需要知道的時候,從來沒有時間真正弄清楚它們。謝謝(你的)信息。 – 2010-07-28 18:17:06

1

我認爲問題是timerId的範圍。嘗試更改警報('現在應該停止');提醒('現在應該停止'+ timerId);

我敢打賭,你會發現timerId始終是相同的值。

+0

嗨喬爾,曾試過這個,但價值總是不同。 – 2010-07-28 14:56:24