2014-11-04 2 views
-2

나는 여기서 바보 같은 실수를하고 있다고 생각하지만 나는 그것을 보지 못했다. 내가 < 리 >의 목록을 얻으려고 노력하고 각각에 대해 작동 setInterval를 사용하지만, setInterval 내가 기대했던 방식으로 행동하지 않습니다. 내 마크 업의jQuery each() 루프의 setInterval

코드 조각 : 내 자바 스크립트의

<ul> 
    <li id="thing1"></li> 
    <li id="thing2"></li> 
    <li id="thing3"></li> 
</ul> 

발췌문 :

thing1 
thing2 
thing3 
(repeating 500ms) 

하지만 실제로 내가 : 나는/좋아하는 콘솔 출력이 될 것으로 기대 것이 무엇

$("ul li").each(function(){ 
    button = $(this).attr("id"); 
    setInterval(function(){console.log(button);}, 500); 
}); 

얻으세요 :

thing1 
thing1 
thing1 
(repeating 500ms) 

여기서 내가 뭘 잘못하고 있니? 그것은 범위의 일입니까?

+1

고전적인 문제'var'을 사용하지 않으면 예기치 않은 상황이 발생합니다. 간격이 경과 할 때 전역 변수가 변경됩니다. – charlietfl

+0

내 질문이 왜 downvoted되고 있는지 잘 모르십니까? 유효하지 않습니까? – Michael

+0

일반적인 코딩 오류를 찾는 데 도움이되는 http://jshint.com과 같은 도구 사용을 고려하십시오. –

답변

2

여기에 반복했다. 이것은 그것이 하나의 가치를 가질 것이라는 것을 의미합니다. 당신이 아마 원하는 것은 : 당신의 setInterval() 콜백 함수에 대한 폐쇄 범위에있을 것이다 each() 콜백 함수에 로컬 변수를 생성합니다

$("ul li").each(function(){ 
    var button = $(this).attr("id"); 
    setInterval(function(){console.log(button);}, 500); 
}); 

.

2

"로컬 변수로 '버튼을 선언하는 것을 잊었습니다. 그없이

var button = $(this).attr("id"); 

는 변수 글로벌입니다. 당신은 전역 변수와 변수 "버튼을"사용

$("ul li").each(function(){ 
    button = $(this).attr("id"); 
    setInterval(function(){console.log(button);}, 500); 
}); 

그것의 하나의 인스턴스 만이있다 : 당신의 코드에서

+0

그건 내 문제 야! 고맙습니다. – Michael