Каждая «одушевленная» функция (lipAnimate, eyeAnimate и т. Д.) Создает функцию, которая назначается переменной doMove
.
Проблема в том, что doMove
не объявлено с ключевым словом var
, поэтому вы делаете его глобальным, и поэтому оно перезаписывается при каждом новом вызове функции "animate".
Вам нужно сделать это локальным, чтобы они не были уничтожены. Но теперь ваш setInterval
вызывает doMove
, передавая строку, которая ожидает, что doMove
будет глобальным. Вместо этого он должен передать прямую ссылку.
Вот исправление к одной из функций. Внесите те же исправления в другие.
function lipAnimate(){
var delaylip = 250;
var repeatslip = 0;
var timeslip = 4;
var ilip = 1;
var jlip = 0;
// Make doMove local
function doMove() {
if( ilip < timeslip ){
// Chain jQuery functions instead of repeating DOM selection
$('#lip').removeClass('lip4')
.removeClass('lip'+ilip)
.addClass('lip'+(ilip+1));
} else if ( ilip == timeslip ) {
$('#lip').removeClass('lip4')
.addClass('lip1');
}
++ilip;
if( ilip >= timeslip ) {
if (jlip < repeatslip || repeatslip == 0) {
ilip = 1; jlip++;
} else {
clearInterval( intervallip ) ;
}
}
}
// pass a reference instead of a string
var intervallip = setInterval ( doMove, delaylip );
}
В целом, было бы лучше, если бы вы просто создали одну функцию, которая принимала параметры, вместо создания четырех почти идентичных функций.
animatePart(250,0,4,1,0,'#lip','lip',4);
animatePart(250,0,3,1,0,'#eye','eyes',3);
animatePart(500,0,4,1,0,'#lhs','lft_hnd_',4);
animatePart(500,0,4,1,0,'#rhs','rit_hnd_',4);
function animatePart(delay,repeats,times,i,j,sel,cls,clsNum){
function doMove() {
if( i < times ){
// Chain jQuery functions instead of repeating DOM selection
$( sel ).removeClass( cls + clsNum )
.removeClass( cls + i )
.addClass( cls + ( i + 1 ) );
} else if ( i == times ) {
$( sel ).removeClass( cls + clsNum )
.addClass( cls + 1 );
}
++i;
if( i >= times ) {
if (j < repeats || repeats == 0) {
i = 1; j++;
} else {
clearInterval( interval ) ;
}
}
}
var interval = setInterval ( doMove, delay );
}