2013-01-02 36 views
1

我有一系列圖片來創建動畫。這可以通過使用下面的代碼來實現,但是我在開始一個新的動畫時遇到了多次點擊混淆的常見問題。禁用動畫序列的點擊功能

我需要能夠在動畫運行時禁用點擊或類似的效果。它可以禁用點擊直到動畫結束,或重置動畫以重新開始並清除當前正在運行的序列。

目前,我有以下代碼:

$(".startbutton").click(function() { 
$(this).clearQueue(function() { 

$(this).find("ul li:nth-child(1)").delay(124).animate({opacity: 0.0}, 0).delay(1860).animate({opacity: 1.0}, 0); 
$(this).find("ul li:nth-child(2)").delay(124).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(3)").delay(248).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(4)").delay(372).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(5)").delay(496).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(6)").delay(620).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(7)").delay(744).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(8)").delay(868).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(9)").delay(992).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(10)").delay(1116).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(11)").delay(1240).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(12)").delay(1364).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(13)").delay(1488).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(14)").delay(1612).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(15)").delay(1736).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(16)").delay(1860).animate({opacity: 1.0}, 0).delay(125).animate({opacity: 0.0}, 0); 
$(this).find("ul li:nth-child(17)").animate({opacity: 0.0}, 0).delay(1984).animate({opacity: 1.0}, 0); 

}); 
}); 

.clearQueue我插入的動畫不再可以多次點擊和搞砸了的作品。但是,一旦動畫序列完成,動畫就不能再被點擊並且不會再次運行。

我猜我需要'清除''clearQueue'或類似的東西。

如果任何人有任何建議,將不勝感激。我曾嘗試使用人們在其他類似帖子中建議的':animated'解決方案,這似乎是一個明智的解決方案,但迄今尚未解決問題。

+1

['for'loop](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for)。 *用它*。 – nbrooks

+0

我想知道這一點:「動畫不能再被點擊」。這是否意味着點擊開始按鈕或實際的動畫元素('ul li')?下面的 – hayavuk

+0

是一個測試頁,包含我正在嘗試執行的操作,以及如何使用上面提供的腳本來處理它。希望會有所幫助。 –

回答

1

好吧,由於OP提供了示例代碼,我將相應地修改此答案。

這裏的工作版本:

http://jsfiddle.net/qZGMW/

首先,使用標誌按我原來的建議是:

var started = false; 
$(selector).click(function() { 
    if (started) { return; } 
    started = true; 
    $(this).stop(); // Do not use clearQueue 
    // Do animation normally 
    $(lastOne).animate(param, param, function() { started = false; }); 
}); 
+0

謝謝。我用這種方法嘗試了幾個不同的標誌,但沒有一個因爲某種原因而工作。也嘗試過你的,但也沒有解決問題。我不確定爲什麼。雖然會多玩一會兒。 –

+0

輝煌,謝謝。這是完美的。 :) –

0

this query API看看防止默認動作發生。

剛剛嘗試下面這段代碼片斷..

$(".startbutton").click(function(e) { 
    e.preventDefault(); 
    $(this).clearQueue(function() { 
    your code continues... 
+0

沒有downvote,但我不認爲這是相關的在這種情況下。是嗎? – hayavuk

+0

@bvukelic對不起,我第一次看,我認爲他試圖阻止默認點擊行動..現在我看到這是關於多個點擊行動.. – ADITHYAN

+0

沒有必要道歉。只是在說'。 :) – hayavuk

1

通用規範建議:沒有爲同一形式的重複動作for loop。正如你在下面看到的,它使得代碼更短,更簡潔。關於您的主題,.clearQueue不會將回調函數作爲參數。在開始動畫之前調用它。 .stop也可能是有用的,你可以試驗效果,看看你喜歡什麼。

$(".startbutton").click(function() { 
    // $(this).clearQueue(); <- Correct usage, but unnecessary with .stop() 
    $(this).stop(true, true); 

    var $lis = $(this).find("ul li"); 
    $lis.stop(true, true); 

    $lis.filter(":nth-child(1)")//.delay(124) <- Unnecessary delay here? 
     .animate({opacity: 0.0}, 0).delay(1860).animate({opacity: 1.0}, 0); 

    for (var i=1; i< 16; i++) { 
     $lis.filter(":nth-child(" + i+1 + ")") 
      .delay(i * 124) 
      .animate({opacity: 1.0}, 0) 
      .delay(125) 
      .animate({opacity: 0.0}, 0); 
    } 

    $lis.filter(":nth-child(17)") 
     .animate({opacity: 0.0}, 0).delay(1984).animate({opacity: 1.0}, 0); 
});​ 
+0

謝謝。我已經嘗試了.clearQueue和.Stop,但對動畫沒有任何影響,除非我以上述方式使用.clearQueue(函數),只有這樣才能停止執行代碼時的多次點擊,而動畫正在運行時,但也停止進一步的點擊一旦它已經停止 –

+0

至於循環代碼,我不能得到這個目前執行。我同意這是一個更整潔的結構,但因爲我只有17個圖像和動畫是簡而言之,如果我能夠完成它的工作,單獨指定我已經足夠了,對於更長的代碼,更簡潔的代碼將會很有用,我會玩弄你給我的東西,看看我能否實現它。 (1)的延遲是需要的,因爲它實際上是第一個動畫(17),後面我添加了一些「點擊」文本,這就是原因。 –