setblink(id)
은 즉시 함수를 호출합니다. 스택 오버플로는 setTimeout
이후의 실행 일정 이후의 호출이 현재 호출 스택에 푸시되지 않으므로 지연된 실행보다 즉각적인 현상입니다.
setblink
이 인수를 취하므로 nullary 익명 함수 (lazy evaluation)로 묶습니다.
function setblink(id) {
var elm = document.getElementById(id);
if (elm.color == "red"){
elm.color = "black";
}
else{
elm.color = "red";
}
setTimeout(function() {setblink(id)},500);
}
for (var x in repsToBlink){
(function (id) {
setTimeout(function() {setblink(id)},500);
})(repsToBlink[x]);
}
코드에 더 많은 개선이 필요합니다.
repsToBlink
가 배열 인 경우,해야 repsToBlink
(for (...;...;...)
)의 loop over the integer indices 아닌 속성 (for ... in
). 그러나 대신 ids에 값이 아닌 인덱스가있는 객체를 사용하는 경우 for ... in
이 적합합니다.
위의 내용은 각각 id
에 대한 별도의 타이머를 실행합니다 (브라우저에 부담을 줄 수 있음). 루프를 스케줄링 할 수있는 유일한 기능이되는 기능으로 이동 시키면 단일 타이머 만 필요합니다.
주기적으로 기능을 실행 중이므로 setInterval
이 더 적절합니다.
repsToBlink
에서 ID를 제거 할 때마다 나머지가 있는지 확인하십시오. 그렇지 않은 경우 간격을 취소하십시오. 당신이 함수의 결과를 전달하는 반면,
setTimeout(function() { setblink(id) },500);
setTimeout()
이 함수는 매개 변수로 전달 될 것으로 기대 :
(function() {
var repsToBlink, repCount=0, blinkInterval;
function startBlinking(ids) {
addRepsToBlink(ids);
if (! blinkInterval) {
blinkInterval = setTimeout(blinkAll, 500);
}
}
function addRepsToBlink(ids) {
for (var i=0; i<ids.length; ++i) {
addRep(ids[i]);
}
}
function addRep(id) {
if (! id in repsToBlink) {
++repCount;
repsToBlink[ids[i]] = true;
}
}
function removeRep(id) {
if (id in repsToBlink) {
delete repsToBlink[id];
--repCount;
if (!repCount) {
clearInterval(blinkInterval);
blinkInterval=0;
}
}
}
function blinkAll() {
for (id in repsToBlink) {
blink(id);
}
}
function blink(id) {
var elm = document.getElementById(id);
if (elm.color == "red"){
elm.color = "black";
} else {
elm.color = "red";
}
}
window.startBlinking = startBlinking;
window.addRepsToBlink = addRepsToBlink;
window.addRep = addRep;
window.removeRep = removeRep;
})();
순수한 CSS로 이것을 수행하려면 [this] try (http://jsfiddle.net/Krr7m/)를 시도하십시오. [MDN] (https://developer.mozilla.org/en/CSS/CSS_animations)에서 자세한 정보를 얻을 수 있습니다. 더 많은 브라우저에서 작동하려면 벤더 특정 접두사를 추가해야하며 이전 브라우저에서는 작동하지 않습니다. –
저는 각 요소에 대해'setTimeout()'에 대한 열렬한 팬이 아닙니다. 목록을 대신 사용하십시오 : http://jsfiddle.net/HdCbt/ –
[Maximum Call Stack Size Exceeded] (http://stackoverflow.com/questions/8731840/)의 dup, [왜 괄호가있는 setTimeout은 새로운 callstack?] (http://stackoverflow.com/questions/8058996/). – outis