0

我的代码应该创建一组 div,其中包含以 status-fade out 开头的类,然后通过将数字加 10 将类从 ie status-1 更改为 status-11。除了 parseint 正在循环并且类变为 status-179831、status-179832 之外,一切正常。

$(function disappear(){
    $('[class^="status-"]').delay(5000).fadeOut(400)
    $('[class^="status-"]').each(function(){
        num = $(this).attr('class').split('status-')[1];
        num = parseInt(num, 10) + 10;
        $(this).attr("class", "status-"+num+"");
    })
    $('[class^="status-"]').delay(1000).fadeIn(400)
    disappear();
})
4

1 回答 1

1

为了让您的操作按顺序工作,您需要使用动画的完成功能,如下所示:

$(function (){

    function runOne(item) {
        item.delay(5000).fadeOut(400, function() {
            var num = item.attr('class').split('status-')[1];
            num = parseInt(num, 10) + 10;
            item.attr("class", "status-"+num+"")
                .delay(1000).fadeIn(400, function() {runOne(item)});
        });
    }

    // start all the animations    
    $('[class^="status-"]').each(function() {
        runOne($(this));
    });
})

工作演示:http: //jsfiddle.net/jfriend00/k7aS7/

在编写代码时,这两个动画是异步的,并且您的.each()循环或下一次调用disappear()不要等待动画完成。当动画完成时,使用这样的完成函数会触发序列的下一部分。您还希望始终确保var在局部变量之前使用,以避免意外地将它们设为全局变量。


您还可以同步一个 promise 对象,该对象将保证所有动画在每次迭代时始终同时开始:

$(function disappear() {
    var all = $('[class^="status-"]');
    all.delay(5000).fadeOut(400, function() {
        var item = $(this);
        var num = item.attr('class').split('status-')[1];
        num = parseInt(num, 10) + 10;
        item.attr("class", "status-"+num+"")
        item.delay(1000).fadeIn(400);
    })
    // when all animations are done, start the whole process over again
    all.promise().done(disappear);
})

此选项的工作演示:http: //jsfiddle.net/jfriend00/SY5wr/


要在每次迭代后将类名恢复为原始类名,您可以这样做:

$(function () {
    // save original class names
    var all = $('[class^="status-"]').each(function() {
        $(this).data("origClassName", this.className);
    });

    function disappear() {
        all.delay(5000).fadeOut(400, function() {
            var item = $(this);
            var num = item.attr('class').split('status-')[1];
            num = parseInt(num, 10) + 10;
            item.attr("class", "status-"+num+"")
            item.delay(1000).fadeIn(400);
        })
        // when all animations are done, start the whole process over again
        all.promise().done(function() {
            // restore class names
            all.each(function() {
                this.className = $(this).data("origClassName");
            })
            // run it all again
            disappear();
        });
    }
    // start it
    disappear();
})

工作演示:http: //jsfiddle.net/jfriend00/hTmHL/

于 2013-11-09T19:59:23.043 回答