2013-07-05 1 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

Вы можете использовать promise() функцию JQuery, чтобы вызвать функцию обратного вызова, когда все анимации закончены.

Попробуйте:

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

Кажется, что для этой цели был применен метод prom(): http://api.jquery.com/promise/ – Sebastien

 Смежные вопросы

  • Нет связанных вопросов^_^