2013-07-05 33 views
3

我在JavaScript中有以下幾種方法:等待動畫功能在javascript

Controller.prototype.changeScene = function (curScene, newScene) { 
    sf.scene.hide(curScene); 
    sf.scene.show(newScene, curScene); 
    sf.scene.focus(newScene); 
}; 

而在另一個JS類:

Test.prototype.handleHide = function() { 
    alert("SceneDialog.handleHide()"); 
    $(".screenOverlay").fadeOut("slow"); 
    $(".dialogBox").fadeOut("slow"); 
}; 

sf.scene.hide()調用handleHide方法。在handleHide有一些動畫,但沒有顯示。控制器不會等待它完成。

我試過$.when(sf.scene.hide()).done()沒有任何運氣。

有什麼建議嗎?

+0

您正在使用哪些動畫功能? 'animate'? 「fadeout」和「fadein」在完成時有回調函數 – dm03514

+1

您還在等待完成哪些動畫?正如所寫的,兩個fadeOut都會執行,並立即返回到下一個語句。 – Alan

+0

http://www.learningjquery.com/2009/01/quick-tip-prevent-animation-queue-buildup –

回答

0

如果您使用的是jQuery動畫功能,jquery通常會提供一個complete參數,該參數將在函數完成時調用。

使用fadeout

$('#test').fadeOut('slow', function() { 
    // fadeout is finished!! do something 
}); 
1

您可以使用jQuery的queue保持排隊的前一個完成後纔出現的動畫列表。

sf.scene.hide(curScene); 
sf.scene.show(newScene, curScene); 
sf.scene.focus(newScene); 

將成爲:

sf.scene.hide(curScene); 
sf.scene.queue(function() { 
    $(this).show(newScene, curScene); 
    $(this).dequeue(); 
}); 
sf.scene.queue(function() { 
    sf.scene.focus(newScene); 
    $(this).dequeue(); 
}); 
1

您可以使用jQuery的promise()函數來調用回調時,所有的動畫已經結束了。

試用:

Test.prototype.handleHide = function (callback) { 
    $(".screenOverlay,.dialogBox").each(
     function(i) { 
      $(this).fadeOut("slow"); 
     } 
    ); 
    $(".screenOverlay,.dialogBox").promise().done(callback); 
}; 

又通回調作爲參數傳遞給handleHide。您的changeScene功能應如下所示:

Controller.prototype.changeScene = function (curScene, newScene) { 
    sf.scene.hide(curScene, function() { 
     sf.scene.show(newScene, curScene); 
     sf.scene.focus(newScene); 
    }); 
}; 
+0

這會調用回調2x,還是等到兩個淡入淡出動畫完成並調用回調一次? – Alan

+0

這是一個很好的問題。下面是jquery doc語句:「如果多個元素都是動畫的,注意回調對每個匹配元素執行一次,而不是整個動畫一次。」你是對的,回調將被執行兩次。 – Sebastien

+0

似乎promise()方法是爲此目的而創建的:http://api.jquery.com/promise/ – Sebastien