javascript - JQuery 队列问题

标签 javascript jquery jquery-animate jquery-ui-accordion jquery-queue

我在使 JQuery 队列工作时遇到一些严重的问题。所有定义的函数都会立即执行,因此类更改发生在动画之前 - 我们希望它淡出,然后更改类,然后淡入。

function animatePlusMinus(){
    if ($(this).hasClass("ui-icon-minus")) {
        $(this).queue("goPlus",function(next) {
                $(this).fadeOut(500);
                next();
            })
            .queue("goPlus", function (next) {
                $(this).removeClass("ui-icon-minus").addClass("ui-icon-plus").fadeIn(500);
            })
            .dequeue("goPlus");

    } else if ($(this).hasClass("ui-icon-plus")) {
        $(this)
            .queue("goMinus", function (next) {
                $(this).fadeOut(500);
                next();
            })
            .queue("goMinus", function (next) {
                $(this).removeClass("ui-icon-plus").addClass("ui-icon-minus").fadeIn(500);
            })
            .dequeue("goMinus");
    }
}

我可以使用 fadeOut 上的回调函数来完成这个简单的示例,但是我想以需要适当队列的方式扩展此逻辑。我还需要学习如何使用 .queue()!

更新:Here is an JSFiddle

最佳答案

现在,您在淡入淡出开始后立即调用next

解决方案是将 next 作为回调传递给 fadeOut:

function animatePlusMinus(){
    if ($(this).hasClass("ui-icon-minus")) {
        $(this).queue("goPlus",function(next) {
                $(this).fadeOut(500, next);
            })
            .queue("goPlus", function (next) {
                $(this).removeClass("ui-icon-minus").addClass("ui-icon-plus").fadeIn(500);
            })
            .dequeue("goPlus");

    } else if ($(this).hasClass("ui-icon-plus")) {
        $(this)
            .queue("goMinus", function (next) {
                $(this).fadeOut(500, next);
            })
            .queue("goMinus", function (next) {
                $(this).removeClass("ui-icon-plus").addClass("ui-icon-minus").fadeIn(500);
            })
            .dequeue("goMinus");
    }
}

但如果您正在寻找更通用的解决方案,您可能最好深入研究 promises而不是进入队列。在这里,通过 jQuery 的 Promise 实现,您可以做到

function animatePlusMinus(){
    if ($(this).hasClass("ui-icon-minus")) {
        $(this).fadeOut(500).promise().then(function(){
            $(this).removeClass("ui-icon-minus").addClass("ui-icon-plus").fadeIn(500);
        });
    } else if ($(this).hasClass("ui-icon-plus")) {
        $(this).fadeOut(500).promise().then(function(){
            $(this).removeClass("ui-icon-plus").addClass("ui-icon-minus").fadeIn(500);          
        });
    }
}

关于javascript - JQuery 队列问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30219426/

相关文章:

javascript - 使用 ionic 框架和 angularjs 在图像元素中使用 "this"关键字

jquery - 在 jquery 中创建一个随机边框

javascript - 通过动态拖动(按钮)在可编辑内容中精确拖放

javascript - 检测鼠标滚动 Action jQuery

javascript - 无论如何,要使用 jQuery 在移动设备上流畅地制作动画吗?

javascript - 在 ValueChange 事件上使用组合框值更新文本框

javascript - Angular : Override '@' property in isolate scope in link or controller

javascript - 运行 Google 协作平台小部件的权限问题

jquery - 成功时重定向并失败时显示错误

javascript - jQuery 和 Zoomooz.js 之间的冲突 : animate & zoomTarget at the same time