jQuery:淡出 - 做某事 - 淡入模式

发布于 2024-09-10 05:50:45 字数 971 浏览 6 评论 0原文

我似乎经常编写类似于以下模式的 jQuery 代码:

Fade Out ==>在幕后做一些事情==>淡入
如下图所示:

/// <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);
                    });
            }
        });
    });
});

这工作正常,但是回调层次结构变得非常深,我只是想知道是否有更简单的方法来做到这一点,或者更好的技术,不会导致这么多级别的回调

I seem to regularly write jQuery code of a pattern similar to this:

Fade Out ==> Do Something Behind the Scenes ==> Fade In
Illustrated below:

/// <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);
                    });
            }
        });
    });
});

This works fine, but the callback hierarchy gets pretty deep and I'm just wondering if there's an easier way to do this or a better technique that doesn't result in so many levels of callbacks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清醇 2024-09-17 05:50:45

使用 jQuery 的 .queue

$("#Target")
    .fadeOut()
    .queue(function() {
        if (id != "")
            // Do Something
            $(this).load(
                "/Site/Controller/Action/"+id, null,
                $(this).dequeue
            );
        else
            $(this).dequeue();
    })
    .fadeIn()

Use jQuery's .queue

$("#Target")
    .fadeOut()
    .queue(function() {
        if (id != "")
            // Do Something
            $(this).load(
                "/Site/Controller/Action/"+id, null,
                $(this).dequeue
            );
        else
            $(this).dequeue();
    })
    .fadeIn()
み格子的夏天 2024-09-17 05:50:45

使用 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 队列

With jQuery.queue() you can append multiple commands to execute in sequence.
How you use it depends on what you want to do. Here's two solutions:

1) targeting a single element:

$('#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)You could look at it another way- create a queue function which does many things, and then execute it whenever you want:

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();
    })

You can also use the queue:false variable. This means the queue wont wait for this operation to finish, so will start the next straight away. Its useful to do two animations together:

function runIt() {
    $("#first").animate(
        {width: '200px'},
        {duration:2000, queue:false}
    );
    $footer.animate(
        {left:'+=200'},
        2000
    );
}

With AJAX, queues get a bit more complicated. Check out this post:

AJAX Queues on this post.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文