jQuery каждая функция parseInt loop

0

Мой код должен сделать набор div с классами, начинающимися с status-, затем исчезать, а затем изменить классы с status- 1 на status- 11, добавив 10 номера. Все работает, за исключением того, что 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();
})
  • 0
    Можете ли вы добавить немного DOM, чтобы получить лучшее представление о том, что происходит?
Теги:

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 перед локальными переменными, чтобы случайно не сделать их глобальными переменными.


Вы также можете синхронизировать объект обещания, который гарантирует, что все анимации всегда будут запускаться одновременно на каждой итерации:

$(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/

  • 0
    спасибо, что он работает хорошо, однако, как я могу изменить его обратно на статус-1, статус-2 ... после каждого исчезновения?
  • 0
    @ user2974729 - Я не понимаю, что ты хочешь делать. Вы пытаетесь восстановить исходный класс status-xxx после каждой итерации?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню