2012-04-02 3 views
0

저는 자바 스크립트에 다소 익숙하며 제 기능으로 어떤 일이 벌어지고 있는지 정확히 알 수는 없습니다.함수로 동적으로 자바 스크립트 이벤트 핸들러를 정의하는 방법

배경 : 내 스크립트는 요소에 "toggler"또는 "toggled"클래스를 할당하여 자동으로 링크하도록 설정되어 있으므로 토글 러를 선택/선택 취소하면 토글 됨이 표시/숨길 것입니다. 이 작업을 수행 할 수있는 라이브러리가 많이 있지만이 경우에는 사용할 수 없습니다.)

스크립트는 pageload에서 실행되고 "toggler"클래스가있는 요소를 검색 한 다음 그에 따라 onclick 처리기를 할당합니다.

function makeToggle() { 
    for (i=0;i<toggler.length;i++) { 
     toggler[i].onclick=function(){toggleSection(this,i)}; 
    } 
    } 

    function toggleSection(obj,index) { 
    if (obj.checked==true) { 
     toggled[index].style.display="inline-block"; 
    } else { 
     toggled[index].style.display="none"; 
    } 
    } 

"이것은" "인덱스"항상 대신 toggler 배열의 길이로 설정되어 제대로 전달하고에 적용된 어떤 체크 박스로 확인되지만 다음은 코드 내가 함께 문제가 발생의 비트입니다 증분되고있다. 예를 들어, 제 1 및 제 2 togglers '온 클릭은 다음과 같아야합니다

onclick="toggleSection(this,0)" 
onclick="toggleSection(this,1)" 

그들은 실제로 (I 5 개 요소가 toggler로 정의 가정)에 설정되어 무엇입니까 : 나는 무엇에서

onclick="toggleSection(this,5)" 
onclick="toggleSection(this,5)" 

' 읽어 보았습니다. 범위가 문제이거나 기능이라고 부르는 방식이라고 생각합니다.하지만 아무 것도 발견하지 못했습니다.

+0

모든 답변은 매우 도움이되었다. jbabey의 대답은 받아 들여지는 대답입니다. 설명의 자리에서 실제로 일어나는 일에 대해 좀 더 깊이 들어가기 때문입니다.폐쇄를 이해하는 데 도움이되는 위대한 링크 – ctshiner

답변

0

당신은,

이 같은 시도, 당신의 onclick 기능에 paramater 등의 변수 ( 내가)를 통과해야 this blog post에 자세히 설명 된 문제를 확인하십시오.

이 이유는 상당히 복잡합니다. 이벤트 처리기로 정의한 익명 함수는 for 루프가 아닌 attachEventsToListItems의 범위에서 변수 i를 상속합니다. 그러나 이벤트 처리기가 실행될 때 for 루프는 반복을 완료하고이 함수의 i 값은 4가됩니다. 여기서 문제는 이벤트 처리기로 정의한 함수가 새 범위를 만들지 않는다는 것입니다 그들이 처형 될 때까지.

for (i=0;i<toggler.length;i++) { 
    toggler[i].onclick= (function (index) { 
     return function() { 
      toggleSection(this,index); 
     }; 
    }) (i); 
} 

당신은 여기에 배우에서 볼 수 있습니다 :

이 문제를 해결하려면, 당신은 폐쇄를 필요 http://jsfiddle.net/Vb2t2/

+0

와우, 고마워. 매우 유용한 답변. 그 링크 jbabey 나에게 옳은 방향, 학습 현명한 지적하는 데 도움이 준. 다시 한 번 감사드립니다! – ctshiner

+0

@ctshiner 당신은 문제를 해결하는 답변을 받아 들여야합니다;) – jbabey

1

해당 변수를 사용할 수 없습니다. 은 함수를 만드는 동안과 비슷합니다. . 그렇게하면 의 값은이고, 마지막 값은 입니다.이됩니다. 귀하의 문제에서 나는 항상 toggler의 길이가됩니다.

그래서 당신은

function makeToggle() { 
    for (i=0;i<toggler.length;i++) { 
     toggler[i].addEventListener("click", (function(d) { return function(){ 
        toggleSection(this,d); 
     }; })(i), true); 
    } 
} 

또는 스타일

,

function makeToggle() { 
    for (i=0;i<toggler.length;i++) { 
     toggler[i].onclick = (function(d) { return function(){toggleSection(this,d)}})(i); 
    } 
} 
+1

ocanal이 쓴 것은 정확합니다. 나는 diffestence를 보여주기 위해 jsFiddle 예제를 만들었습니다. http://jsfiddle.net/5K2a4/1/ – freakish

관련 문제