2010-12-06 7 views
1

나는 "항목"이라는 클래스에 약 12 ​​div 요소가 있습니다.observe를 사용하여 함수가 할당되면 함수에 매개 변수를 전달하는 방법은 무엇입니까?

for 루프를 사용하여 각 요소에 onClick 자바 스크립트 함수를 연결했습니다.

for(var i = 0; i < $$(".item").length; i++){ 
    $$(".item")[i].observe("click", detailPopup); 
} 

"item"클래스 인 요소는 "detailPopup"함수를 실행합니다. 하지만 그 함수에 매개 변수를 전달하고 싶습니다. 더 구체적으로 말하자면, "this"()가 전달되기를 바랍니다.

어떻게해야합니까 ??

가능한 한 구체적인 질문을 한 것 같지만, 그렇지 않은 경우를 대비하여 알려주십시오. 질문을 명확히 해 드리겠습니다.

감사합니다!

+0

이 'for' 루프가 실행되었을 때의 컨텍스트와 마찬가지로 현재'this'를 전달하고 싶습니까? 아니면 클릭 된 요소 자체입니까? 'this'는 이미'detailPopup' 함수 안에서'this' 키워드를 사용해서 원하는 것을 참조해야합니다. –

답변

2

나는 명시 적으로 당신이 당신의 매개 변수를 burn in 할 수 있어야한다고 생각이 나 자신을 시도하지 않은 있지만.

$$('.item').invoke('observe', 'click', detailPopup.curry(this)); 

this에 대한 참조는 모든 다른 파라미터 전에 통과 될 것이다. 귀하의 기능은

function detailPopup(parent, event) 
{ 
    ... 

this의 원래 의미

는 핸들러의 범위에 대한 트리거 요소의 보존은 ... 다음과 같은 형태가 될 것이다. 또한 인덱스 값과 익명의 함수 및 물건을 사용하는 것을 피하기 위해 invoke을 사용했습니다.

0

당신은 이런 식으로 작업을 수행 할 수 있습니다

(function(t){ ... })(this);
for(var i = 0; i < $$(".item").length; i++){ 
    (function(t){ 
     $$(".item")[i].observe("click", function { detailPopup(t); }); 
    })(this); 
} 

this 올바른 그렇지 않으면 당신은 범위 지정 얻을 것이다 문제가 있음을 보장하는 폐쇄입니다. 이것은 루프가 그 중 하나 인 상황에서 중요합니다. for 루프를 사용하지 않았다면 다음과 같이 할 수 있습니다.

$$(".item")[i].observe("click", function { detailPopup(someParameter); }); 
+0

'(함수 ...) (매개 변수)'형식은 무엇입니까? – clockworkgeek

+0

은 익명 자체 실행 기능입니다. http://stackoverflow.com/questions/186024/how-do-you-explain-this-structure-in-javascript에서 첫 번째 답변이 올바른지 확인하십시오. –

1

익명의 함수를 만들고 싶습니다. detailPopup 대신 다음과 같이 입력해야합니다. function() { detailPopup(that); }

that은 무엇입니까? this의 값은 중첩 된 함수로 전달되지 않으므로이를 사용하기 전에이를 변수에 할당해야합니다. 예 : 함수에 this를 결합 할 수 var that = this;

var that = this; 

for(var i = 0; i < $$(".item").length; i++){ 
    $$(".item")[i].observe("click", function() { detailPopup(that); }); 
} 
2

는 :

for(var i = 0; i < $$(".item").length; i++){ 
    $$(".item")[i].observe("click", detailPopup.bind(this)); 
} 

JSFiddle Example

+0

이것은 영리합니다. 'detailPopup'의'this' 값은 정상적인 이벤트처럼 트리거 한 엘리먼트 대신에 호출자가 될 것입니다. – clockworkgeek

+0

@clockworkgeek : 정확하게, JavaScript 프레임 워크는 Function.apply() 및 Function.call() 메소드를 통해이를 수행 할 수 있습니다. 이 두 함수는 꽤 멋지다. https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function – subhaze

관련 문제