2016-01-19 5 views
-3

Мне нужно что-то оживить, но мое утверждение не имеет никакого эффекта. Мой код:setTimeout, JavaScript, без эффекта

var movei=function(img){ 
    img.setAttribute("src", "blank.png"); 
} 

var comp=function() { 
    ...  
    for(var k=0; k<i; k++) { 
     var img=document.getElementById(id(k,col)); 
     img.setAttribute("src", "circ1.png"); 
     timer=setTimeout(movei(img),1000); 
     ... 
    } 
} 

Я прочитал еще вопросы о setTimeout (setInterval), но я не могу найти ответ.

+5

'movei()' *** немедленно выполняет функцию ***. Чтобы передать обратный вызов, не * вызывайте * это: 'setTimeout (movei, 1000)'. – deceze

+0

Вы можете добавить анонимную функцию и там вызвать 'movei (img)' –

+0

@DnisterLark Я пробовал это, но результат такой, как если бы я никогда не использовал setTimeout –

ответ

0

попробовать timer=setTimeout(function(){movei(img);},1000);

-2

Как @deceze также написал, вам необходимо изменить вызов SetTimeout так, чтобы не вызывать функцию movei, а передать «имя» функции. Тогда вам придется изменить поведение функции movei, чтобы оно либо получило простое строковое имя изображения, либо могло найти изображение самого изображения.

timer=setTimeout(movei,1000); 

или (в не recommented способом)

timer=setTimeout("movei(\"imgName\")",1000); 
+0

Пожалуйста, не предлагайте передавать обратные вызовы как строки. – deceze

+1

И в этом случае строковый метод в этом случае потерпит неудачу – epascarello

+0

@deceze, можете ли вы немного рассказать о том, почему я не должен упоминать обратные вызовы как строки? Я бы не использовал его в качестве своего первого выбора, но в некоторых случаях он мог решить проблему? –

0

Если вы хотите анимировать отдельные элементы, вы должны использовать рекурсию вместо петель.

После кода изображен тот же:

var count = 0; 
 

 
function getId(count) { 
 
    return "div_" + count; 
 
} 
 

 
function initTimer() { 
 
    setTimeout(function() { 
 
    count++; 
 
    var _id = getId(count); 
 
    var _el = document.getElementById(_id); 
 
    show(_el); 
 
    if (count < 7) 
 
     initTimer(); 
 
    }, 1000); 
 
} 
 

 
function show(el) { 
 
    el.style.display = "block"; 
 
} 
 

 
initTimer();
div { 
 
    display: none; 
 
}
<div id="div_1">1</div> 
 
<div id="div_2">2</div> 
 
<div id="div_3">3</div> 
 
<div id="div_4">4</div> 
 
<div id="div_5">5</div> 
 
<div id="div_6">6</div>

Смежные вопросы