jQuery: исчезнуть - сделать что-то - исчезнуть в образце - PullRequest
3 голосов
/ 16 июля 2010

Я, кажется, регулярно пишу код 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 ]

6 голосов
/ 17 июля 2010

Использование jQuery's .queue

$("#Target")
    .fadeOut()
    .queue(function() {
        if (id != "")
            // Do Something
            $(this).load(
                "/Site/Controller/Action/"+id, null,
                $(this).dequeue
            );
        else
            $(this).dequeue();
    })
    .fadeIn()
1 голос
/ 28 августа 2013

С помощью 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 очереди становятся немного сложнее.Проверьте этот пост:

AJAX Очереди на этот пост .

...