2010-07-20 1 views
8

jQuery를 사용하여 몇 가지 요소에 타이머 또는 간격 루프를 설정하여 매 2 초마다 확인합니다. 타이머를 설정하고 다시 시작해야하는지, 설정 및 간격을 확인하고 중지해야하는지 확인해 보았습니다. 클래스 항목에 대한javascript 타이머 또는 간격이 폐쇄문을 사용하여 루프로 생성되었습니다.

var mytimers = new Array(); 
$('div.items').each(function() { 
    myID = $(this).attr('id'); 
    mytimers[myID] = setInterval(function() { myFunction(myID) } , 3000) 
}); 
function myFunction(param) { 
    alert(param); 
    if (something()) { 
     clearInterval(mytimers[param]); 
    } 
} 

의 ID 년대는 ID_1, ID_2, id_3 있습니다 : 간단하지만

이 내가 필요한 기본적이다. 그러나 나는 id_3을주는 3 개의 알림을 받는다. 제 코드에서는 'this'를 전달하기 시작했지만 문제를 파악하기 위해 계속 단순화했습니다.

매번 변수를 새 주소로 복사 할 수 있습니까? 나는 폐쇄를 사용해야한다는 것을 알고있다. 그것은 다른 var 아무 mater 무엇을 참조하는 것으로 보인다.

는 그래서 같은 타이머와 함께 루프로 단순화 시도 :

function tester(item) { 
    return function() { 
     alert(item); 
    }; 
} 
for(x=1;x<=3;x++) { 
    setTimeout('(function() { tester(x) })(x)' , 3000); 
} 

하지만 난 그냥 내 문제가 악화 있다고 생각하고는 아무것도하지 않는 것.

이전 질문을 검색했지만 대부분이 특정 문제를 줄이기보다는 많은 여분의 코드로 채워져 있으며 다른 방식으로 해결되었습니다. 이 예제가 작동하는 방식으로 이것이 더 잘 작동하는지 이해하고 싶습니다. 나는 이것을 작성하는 동안 관리 기능을 사용하여 타이머를 설정할 수 있다고 생각했습니다.

function tester(item) 
    alert(item); 
function myTimer(item) 
    setInterval(function() { tester(item); }, 3000); 
for(x=1;x<=3;x++) 
    myTimer(item); 

어떻게하지 않고이 작업을 수행 할 수 있습니까? 더 좋은 방법이 있습니까?

+3

루프 인덱스를 포함하여 모든 로컬 변수를'var'으로 선언해야합니다. – Pointy

답변

3

각을 사용하는 경우가 폐쇄에있어, 당신은 그냥 잊어 버린 VAR을 가지고

var mytimers = new Array(); 
$('div.items').each(function() { 
    **var** myID = $(this).attr('id'); 
    mytimers[myID] = setInterval(function() { myFunction(myID) } , 3000) 
}); 
function myFunction(param) { 
    alert(param); 
    if (something()) { 
     clearInterval(mytimers[param]); 
    } 
} 
+0

* 이마를 치다. * 나는 실제로 그 곳을 제외하고 모든 종류의 장소에서 var를 시도했다. – phazei

4

는 기능 범위에 변수 개인을 만들기 위해 변수 'MYID'익명 함수에 지역,

var myID = $(this).attr('id'); 
1

그래서 일치하는 각 요소에 3 초마다 myFunction을 실행 하시겠습니까?

이 시도 :

$('div.items').each(myFunction(this)); 

var myFunction = function(elem) { 
    return function() { 
     if (something(elem)) { 
      //return or do something with elem 
     } else { 
      window.setTimeout(myFunction(elem), 3000); 
     } 
    } 
}; 

something()의 조건이 아닌 함수 일정 자체가 이전과 같은 요소로 3 초 다시 실행하는 경우, 완료 충족합니다. 다른 요소에서 원하는만큼 여러 번 호출 할 수 있으며 각 호출에는 고유 한 elem이 있습니다.

나는 elem과 같은 객체를 전달하고 마지막 순간까지 내부 구조 작업을 지연하는 것을 선호합니다. Id 또는 무엇이든에 관하여 something()가 걱정하게하십시오.

연관 배열이있는 다른 체조 중 어느 것도 (new Array() 대신 {}) 또는 clearInterval을 사용할 수 없거나 ID가 필요합니다.

Marimuthu가 말했듯이 솔루션을 실제로 처리하려면 varmyID이라는 선언에서 떼어 놓았습니다. 이는 글로벌을 의미하며 각 반복을 덮어 씁니다.결과적으로 setInterval이 클로저를 통해 고유 한 로컬 myID을 가져 오는 대신 myFunction을 호출하면 이미 umpty 시간을 덮어 쓴 전역 오버레이가 발생합니다.