2015-07-17 5 views
1

Я просто пытаюсь выяснить, как перебирать элементы с одним классом и анимировать их по одному. Я подумал об этом, пока цикл будет работать, но я не понимаю, почему этого не произойдет.jQuery while loop not working

$(document).ready(function() { 
    var index = 0; 
    var images = $('.image'); 

    while (index < images.length) { 
     var image = images[index]; 
     image.animate({ 
      opacity: "1" 
     }, 1000, function() { 
      index++; 
     }); 
    }; 
}); 

Херес Fiddle

+0

Попробуйте image.width() вместо этого в вашем операторе if – wkcamp

+0

Для чего вам не нужно ';' в конце блока 'while'. –

ответ

8

Это простая реализация того, что @Evert brilliantly explains in another answer.

Приводя свой ответ здесь

индекс ++ вызывается в функции обратного вызова, который выполняется после анимации. Анимация начнется только после того, как этот скрипт прекратит выполнение .

Из-за этого индекс ++ никогда не запускается, и цикл никогда не заканчивается.

Вам необходимо переписать это как рекурсивную функцию. Обработчик событий , который теперь вызывает index ++, фактически должен отвечать за настройку следующей анимации .

Реализация может быть что-то вроде этого

var index = 0; 
var images = $('.image'); 
animate(images); 

function animate() { 
    var image = images.eq(index); 
    image.animate({ 
     opacity: "1" 
    }, 1000, function() { 
     index++; 
     animate(); 
    }); 
} 

Demo https://jsfiddle.net/dhirajbodicherla/w4cgctyk/2/

+1

Хорошо сделано =) Соедините свой пример и мои объяснения: P – Evert

+0

Спасибо, что это именно то, что я хотел выполнить. – Crd12h

+0

@Evert: Это именно то, что я собирался сделать – Dhiraj

8

index++ вызывается в функции обратного вызова, который выполнен после анимации. Анимация только начиналась после, этот скрипт прекратил выполнение.

Из-за этого index++ никогда не запускается, и цикл никогда не заканчивается.

Вам необходимо переписать это как рекурсивную функцию. Обработчик событий, который теперь вызывает index++, фактически должен отвечать за настройку следующей анимации.

+0

Спасибо, что поняли, что для меня. Вы и Дхираж помогли мне понять это. – Crd12h

0

Там также JQuery .each функция используется следующим образом:

$('.class').each(function() { 
$(this).animate(); 
}); 

Где это следующий элемент с этим классом

+1

Это не касается того факта, что OP хочет анимировать изображения по одному за раз. – Evert

+0

@Evert я вижу. Цикл while не будет анимировать следующий элемент, пока предыдущий не будет анимирован? Спасибо, что указали это –

-1

Почему бы просто не использовать each функцию JQuery?

var images = $('.image'); 

$.each(images,function(){ 
    $(this).animate({ 
     opacity:"1" 
    }, 1000, function(){ 
     index++; 
    }); 
}); 
+1

. Это не касается того факта, что OP хочет анимировать изображения по одному за раз. – Evert

0

Ваша логика будет неправильно в index++; Вы должны иметь рекурсивную функцию. Вам нужно увеличить значение index в рамках рекурсивной функции.

function YourRecusiveFunction() { 
    var image = images.eq(index); 
    image.animate({ 
     opacity: '1' 
    }, 1000, function() { 
     index++; 
     YourRecusiveFunction(); 
    }); 
} 

Позвонить YourRecusiveFunction() после того, как документ будет готов.