jQuery: исчезать - делать что - то-исчезать в шаблоне
Я, кажется, регулярно пишу код jQuery шаблона, подобного этому:
Fade Out = = > сделай что-нибудь за кулисами = = > Fade In
Показано ниже:
/// <reference path="jquery-1.4.2.js" />
/// <reference path="jquery-1.4.2-vsdoc.js" />
/// <reference path="jquery.validate-vsdoc.js" />
var fade = "slow";
$(document).ready(function () {
// Some event occurs
$("#Trigger").change(function () {
var id = $(this).find(":selected").val();
// Fade out target while I do something
$("#Target").fadeOut(fade, function () {
if (id != "") {
// Do Something
$("#Target").load(
"/Site/Controller/Action/"+id, null,
function () {
// Fade in Target
$("#Target").fadeIn(fade);
});
}
});
});
});
Это работает нормально, но иерархия обратного вызова становится довольно глубокой и мне просто интересно, есть ли более простой способ сделать это или лучшая техника, которая не приводит к такому количеству уровней обратного вызова
2 ответа:
Используйте jQuery
.queue
$("#Target") .fadeOut() .queue(function() { if (id != "") // Do Something $(this).load( "/Site/Controller/Action/"+id, null, $(this).dequeue ); else $(this).dequeue(); }) .fadeIn()
С помощью jQuery.queue() вы можете добавить несколько команд для последовательного выполнения. То, как вы используете его, зависит от того, что вы хотите сделать. Вот два решения:
1) нацеливание на один элемент:
$('#label') .fadeOut() //animate element .queue(function() { //do something method1 ...your code here... $(this).dequeue //dequeue the next item in the queue }) .queue(function (next) { //do something method2 ...your code here... next(); //dequeue the next item in the queue }) .delay(5000) //do lots more cool stuff. .show("slow") .animate({left:'+=200'},2000) .slideToggle(1000) .slideToggle("fast") .animate({left:'-=200'},1500) .hide("slow") .show(1200) .slideUp("normal", runIt) .fadeIn()
2) Вы можете посмотреть на это по-другому-создать функцию очереди, которая делает много вещей, а затем выполнить ее, когда вы хотите:
var $header = $("#header"); var $footer = $("#footer"); function runIt() { $header.queue(function(next){ ...do something... next(); } $header.queue(function(next){ functionABC(variable, next); }) $footer.animate({left:'+=200'},2000); $("#left").slideToggle(1000); $(".class1").slideToggle("fast"); $(".class2").animate({left:'-=200'},1500); $("whatever").delay(3000); $(".class3").hide("slow"); } runIt(); //execute it now, or... $(window).load(function() { //execute it after the page loads! runIt(); })
Можно также использовать переменную queue:false. Это означает, что очередь не будет ждать завершения этой операции, поэтому сразу же начнет следующую. Его полезно сделать две анимации вместе:
function runIt() { $("#first").animate( {width: '200px'}, {duration:2000, queue:false} ); $footer.animate( {left:'+=200'}, 2000 ); }
С AJAX очереди становятся немного сложнее. Проверьте этот пост: