2011-08-06 5 views
0

아래 코드에서 apply를 통해 addEventListener를 호출하려고하지만 웹킷의 콘솔에 "TypeError : Type error"가 표시됩니다.웹킷의 네이티브 JavaScript 메소드에서 apply/call 사용

addEvent = (function (handler) { 
    return function (element, event, fn) { 
    handler.apply(element, [event, fn, false]); 
    }; 
}(addEventListener || attachEvent)); 

나는 적용하고 메소드를 호출 전화를하지만 아무 소용에 모두 노력했다. 확실하지 않은 것을 놓치고 있는지, 또는 내가 아직 모르는 어떤 이유로 허락되지 않은 것을하려고 노력하고 있는가?

또 다른 기사는 이것에 대해 조금 이야기하고 있지만 정확히 어떻게 작동하려고하는지에 대해서는 언급하지 않았습니다. Using native code functions as JavaScript objects in WebKit. 이것은 다음 두 개의 이벤트 모델 간의 다른 차이를 줄이기 위해 확장 될 수

addEvent = (function() { 
    return addEventListener ? 
    function (element, event, fn) { 
     element.addEventListener (event, fn, false); 
    } : 
    function (element, event, fn) { 
     element.attachEvent ('on' + event, fn); 
    }; 
})(); 

: -

+2

여기에 몇 가지 추상화가 있습니다. 'window.addEventListener.apply (anElement, [...])'는 anElement.addEventListener()와 동일하지 않을 것입니다. DOM api는 호스트 (os) 객체를 통해 구현 되었기 때문에 언어 사양에 맞춰야합니다 (즉, 사양이 다릅니다). 또한 IE의 * attachEvent *는 전달 된 이벤트 이름에 접두사 "on"을 요구합니다. –

+0

이번이 처음으로 Stack에 게시되고 나는 그것을 좋아합니다. 기쁜 마음으로 저보다 더 똑똑하고 도움을 줄 수있는 사람들이 있습니다. 이렇게하는 더 좋은 방법은 다음과 같습니다. 요소 [handler.name] (event, fn, false); – kalisjoshua

답변

1

(제대로 초승달 플래시에 의해 언급 된 바와 같이)이 달성의 또 다른 방법은 다음과 같습니다.

+0

나쁜 생각은 아니지만 반환 된 함수 밖에서 if check를 수행하면 한 번만 평가되는 것이 더 낫다고 생각합니다. 클로저를 이용하여 "on"변수를 만들고 함수를 반환하기 전에 변수를 설정하고 함수에서 사용합니다. var on = handler.name === "attachEvent"? "on": ""; 그리고 나서 반환 된 함수 내부에서 : element [handler.name] (on + event, fn, false); 나는 나가 집에서이고 Mac에 단지 있기 때문에 IE에 이것이 작동하는지 다만 생각해 본다. – kalisjoshua

+0

kalisjoshua : 당신 말이 맞아요. 클로저 코드를 완성했습니다. 이제 addEvent는 하나 또는 다른 내부 함수의 값을 갖습니다. – HBP

관련 문제