2012-04-24 3 views

답변

3

간단한 폐쇄 :

var foo = "bar"; 
e.addEventListener('whee',function(evt){ 
    iRespond(evt,foo); 
},false); 

(당신은 루프에서와 같이 변화하고 변수에 래치하고 있기 때문에) 간단한 폐쇄는 그 값이되는 새로운 클로저를 만들 필요하지 않을 때 :

예를 들어
foo.addEventListener('bar',(function(jim){ 
    return function(evt){ 
    iRespond(evt,jim); // Surprise surprise, jim is available here! 
    } 
})(someValueToBeNamedJim), false); 

:

var buttons = document.querySelectorAll('button'); 
for (var i=buttons.length;i--;)} 
    buttons[i].addEventListener('click',(function(j){ 
    return function(){ alert("You clicked on button #"+j); }; 
    })(i),false); 
} 

당신은 이름을 선택할 수 있습니다 변수는 내부 및 외부에서 모두 동일한 기능을 수행하지 않습니다. — 예 : j 위의 i 대신 — 위를 사용하고 있지만 혼란 스러울 수 있습니다.

1

많은 가능성이 있습니다. No1은 그것을위한 클로저를 만들 것입니다. bind()을 사용할 수도 있습니다.

이벤트의 target 속성에 따라 옵션 (항목 당)을 구별하는 것이 더 좋은 해결책 일 수 있습니다.이 옵션은 수신기에도 전달됩니다. 여러 항목에 하나의 핸들러 만 사용하는 경우 매우 유용합니다 (예 : 모든 <li> 요소에 하나가 아닌 <ul>에 추가하십시오. 그런 다음 대상 요소의 ID 또는 데이터 속성을 사용하여 수행 할 작업을 선택하십시오.

+0

+1. – Phrogz

1

아무도 간단한 해결책을 제공하지 않는 것 같습니다.

anItem.addEventListener("click", function() { 
    iRespond(your arg here); 
}, false); 

를 또는, 많은 경우에, 당신은 당신이에서 호출 된 객체를 알기 위해 이벤트 리스너에 this 포인터를 참조 할 수 있습니다 : 다음과 같이 익명 함수에서 다른 함수 호출을 넣어

anItem.addEventListener("click", iRespond, false); 
iRespond에이어서

, 상기 'target`를 사용하여 공통 조상 결합 제안한

function iRespond() { 
    // this points to the item that caused the event so you can 
    // determine which one you are processing and then act accordingly 
    // For example, this.id is the id of the object 
} 
+0

+1 (이 답변은 도움이 될 가능성이 높습니다. – Phrogz

+0

@Phrogz - 내가 입력 할 때 당신의 대답은 나에게 보이지 않았다. – jfriend00

+0

의미가 있으며 걱정할 필요가 없습니다. – Phrogz

관련 문제