2012-05-14 4 views
0

특히 IE를 제외한 모든 브라우저에서 사용할 수있는 getElementsByClassName 함수를 재정의하고 싶습니다. IE는 대신 querySelectorAll을 사용합니다.네이티브 JavaScript 함수 덮어 쓰기

Element.prototype.getElementsByClassName = function(className) { 
    if(document.getElementsByClassName) { 
     return this.getElementsByClassName(className); 
    } else if(document.querySelectorAll) { 
     return this.querySelectorAll(className); 
    } 
}; 

Firefox에서 코드를 실행하면 대신 native 함수가 사용됩니다. 여전히 교차 브라우저 솔루션으로 작동하고 getElementsByClassName을 사용할 수없는 경우 제 프로토 타입을 사용합니까, 아니면 내 코드가 매번 사용되도록 기본 함수를 재정의 할 수있는 방법이 있습니까? 프로토 타입의 이름을 비슷한 이름으로 지정할 수는 있지만 가독성을 높이기 위해 ID는 동일하게 유지하는 것을 선호합니다.

+2

왜 진짜 심 (polyfill)을 사용하지 않습니까? 즉 :'if (! Element.prototype.getElementsByClassName) {Element.prototype.getElementsByClassName = function() {...}; }'http://polyfilljs.com/polyfills/getelementsbyclassname.html –

+0

당신은 혼란 스럽습니다. * getElementsByClassName *은 [host] (http://es5.github.com/#x4.3.8) 메소드입니다. [native ] (http://es5.github.com/#x4.3.6) 방법을 참조하십시오. – RobG

+0

@ MattBall-이 방법을 사용하지 마십시오. 이런 식으로 ** host ** 객체 나 메소드를 수정할 수 있다고 기대할 수는 없습니다 (Prototype.js가 전략으로 놓은 이유를 연구하십시오). 시도한다면 철저한 기능 테스트를 포함시켜야합니다. – RobG

답변

1

매트 볼의 대답을이 질문에 대한 진정한 대답으로 추가하고 싶습니다. 그가 언급했듯이, 원래 내가 설정 한 방식 대신에 polyfill을 사용하는 것이 가장 좋습니다.

if(!Element.prototype.getElementsByClassName) { 
    Element.prototype.getElementsByClassName = function(className) { 
     return this.querySelectorAll(className); 
    } 
} 
+1

많은 브라우저가 DOM 객체 (종종 getElementsByClassName *이없는 객체)에 대한 프로토 타입 상속 체계를 구현하지 않기 때문에 특히 좋은 솔루션은 아닙니다. 또한 필수적인 적절한 기능 감지가 부족합니다. – RobG

+0

polyfill이 실제로 어떻게 작동하는지 다시 살펴보아야합니다. http://polyfilljs.com/js/mylibs/getelementsbyclassname.js –

+0

@RobG 공유 할 수있는 더 나은 솔루션이 있습니까? – ryandlf