2010-02-27 6 views
13

네이티브 document.createElement()은 어리 석다 (태그 이름 만 있고 속성은 없다). 나는 어떻게 그것을 무시할 수 없습니까? 어떻게 이런 일이 안되니?기본 함수를 재정의 하시겠습니까?

var originalFunction = document.createElement; 

document.createElement = function(tag, attributes) { 
    var element = originalFunction(tag); 

    if (attributes) { 
     for (var attribute in attributes) { 
      element.setAttribute(attribute, attributes[attribute]); 
     } 
    } 

    return element; 
}; 

네이티브 기능을 교체하려고하면 브라우저가 터질 수 있습니다. document은 자바 스크립트 프리미티브가 아니므로 프로토 타입을 만들 수 없습니다. WTF.

+17

는'document.createElement는 (..) '중 당신을 많이 생각하지 않습니다. –

+0

왜 네이티브 함수를 재정의하는 대신 자신의 함수를 만들고 사용해야합니까? –

+1

@KennethJ 네임 스페이스 및 기타 물건을 만들지 않고 DOM에서 요소를 만들 때 어떤 사람들은 여전히 ​​표준화 라이브러리를 만들거나 유효성 검사 코드를 실행하려고하기 때문에. – helly0d

답변

1

내가 아는 한 보안상의 이유로 원시 메소드를 대체 할 수 없습니다. 비 네이티브 메소드의 경우, 전혀 문제가되지 않습니다.

+0

일부 브라우저에서는 일부 기본 메서드를 재정의 할 수 있습니다. 나는 아직 오버라이드 할 수없는 네이티브 메소드를 만나지 않았다. –

+0

@JimBlackler - 참고로 MSIE의 콘솔. 은 재정의 할 수는 없지만 보안상의 이유로는 할 수 없기 때문에 가능합니다. (콘솔은 ES에서 다루지 않습니다. 참조 : Microsoft, lol) – Christian

3

FWIW (정보) : 경우에 따라 "네이티브"메서드를 재정의 할 수 있으며, 일부 브라우저에서는 적어도 재정의 할 수 있습니다. 파이어 폭스는 내가 이것을 할 수있게 해준다 :

document.createElement = function(f) { alert(f); }; 

다음은 예상했을 때 예상대로 동작한다. 하지만 위 코드의 전체 블록은 최소한 Firebug를 통해 오류를 발생시킵니다.

철학적으로이 작업을 수행 할 수 있어야합니다. 물론 Array 객체 등에서 메소드를 재정의 할 수는 있지만 윈도우 (DOM) 메소드는 ECMAScript에서 다루지 않으므로 구현에 따라 달라질 수 있습니다. 물론 보안상의 이유로 이러한 방식을 사용합니다. 나는 문제가 있다는 것입니다 말할 수

는 그냥 자신의 방법을 사용하지 왜
3

는 지금까지 ....

document.create= function(tag, parent, attributes){ 
    tag= document.createElement(tag); 
    for(var p in attributes){ 
     if(p== 'css') tag.style.cssText= attributes.css; 
     else if(p== 'text') tag.appendChild(document.createTextNode(attributes.text)); 
     else tag[p]= attributes[p]; 

    } 
    if(parent) parent.appendChild(tag); 
    return tag; 
    } 

document.create('p',document.body,{css:'font-style:italic',className:'important',title:'title', 
text:'whatever text you like'}); 
10

그것을 당신이 원하는 방식으로 작성하고, 다시는 document.createElement를 쓸 기능 - 참조 된 경우에도 document.createElement() 함수에 대한 호출은 문서에서 가져와야합니다. ,

var element = originalFunction.call(document, tag); 
0

가를 오버라이드 (override) 할 수있는 방법은 없습니다하지만 당신은 기본 기능이 아닌 기존의 매개 변수 (들)을 통과하면 affraid하지 않을 경우 주위에 몇 가지 해킹을 수행 할 수 있습니다 그래서 코드를 수정합니다. 그래서 XML DOM의 일부가 될 createElement에 대한 것이므로 원하는 모든 태그 이름을 만들 수 있습니다. 첫 번째 매개 변수 (태그 이름)의 일부로 속성을 전달하고 선택 항목의 구분 기호로 구분 한 다음 DOM의 onchange 이벤트를 청취하고 구분 기호가 모두 표시되는 경우에는 트릭입니다. 태그를 적절한 태그로 바꾸십시오 (예 : RegExp).

관련 문제