Мой код должен сделать набор 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();
})
Чтобы ваши операции работали в последовательном порядке, вам необходимо использовать функцию завершения ваших анимаций следующим образом:
$(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/
status-xxx
после каждой итерации?