Очереди эффектов в Javascript - PullRequest
6 голосов
/ 12 января 2011

Я пытаюсь создать эффект, который работает в очереди, чтобы каждый эффект запускался только после завершения предыдущего.Я добился успеха, но я уверен, что есть более чистый путь.

Это то, что я имею до сих пор:

$("tr:last td:nth-child(1) div").slideUp(200, function() {
    $("tr:last td:nth-child(2) div").slideUp(200, function() {
        $("tr:last td:nth-child(3) div").slideUp(200, function() {
            $("tr:last td:nth-child(4) div").slideUp(200, function() {
                $("tr:last td:nth-child(5) div").slideUp(200, function() {
                    $("tr:last td:nth-child(6) div").slideUp(200, function() {
                        $("tr:last td:nth-child(7) div").slideUp(200, function() {
                            $("tr:last").remove();
                        });
                    });
                });
            });
        });
    });
});

Должен быть более чистый путь, верно?

Заранее очень благодарен.

Ответы [ 3 ]

7 голосов
/ 12 января 2011

Так же, как вы говорите в своем вопросе. Используйте .queue().

http://api.jquery.com/queue

и проверьте:

Что такое очереди в jQuery?

4 голосов
/ 12 января 2011

Ой, это ужасно!Я бы сделал это, используя delay:

var divs = $("tr:last td div");
divs.each(function(idx, el) {
    $(this).delay(idx * 200).slideUp(200, function(){
        if (idx === divs.length - 1) { // 0-based index
            $("tr:last").remove()
        }
    });
});
2 голосов
/ 12 января 2011

Вы могли бы сделать рекурсивную функцию:

function slide(i) {
    if(i < 8) {
        $("tr:last td:nth-child(" + i + ") div").slideUp(200, function() {
            slide(i+1);
        });
    }
    else {
        $("tr:last").remove();
    }
}
slide(1);

Но все это очень жестко закодировано ....

...