2012-06-01 3 views
1

DOM에서 원하는 경우 일부 그룹이나 클래스를 확장하고 싶습니다.하지만 모든 권한을 확장하고 싶지는 않습니다. 것이 가능하다? 예를 들어DOM을 확장하지만 요소 프로토 타입은 아닙니다. 가능합니까?

:

document.getElementsByClass('extended').myMethod(); // working 

하지만

document.getElementById('elementNotExtendedClass').myMethod(); // shouldnt be working 

내가 엉망 모든 요소, 단지 선택된 사람을 싶지 않는 때문에

. 아마도 문서에서 createElement() 메서드의 자체 버전을 만들어서 어떻게 든 완료해야합니다. 예를 들어 document.CreateMyElement()입니다.

또는 어떤 아이디어입니까? 감사합니다

6 월 06 일 수정 : 프로토 타입 체인이 작동하는 솔루션을 찾고 있는데, 일부 공유 방법과 속성을 한 번에 변경할 수 있습니다.

+2

궁극적 인 목표는 무엇입니까? 왜 이것을 필요로합니까? –

+0

@AlexanderPavlov : 내 목표는 웹 페이지에 대한 간단한 wysiwyg 기능을 만드는 것입니다. 나는 페이지의 편집자가 편집 가능한 모드를 시작하고 많은 것들이 편집 가능하다는 것을 의미합니다. 따라서 내 메서드 및 속성을 사용하여 일부 요소를 확장하는 것이 가장 좋은 방법 일 수 있다고 생각합니다. – Luckylooke

답변

2

이유는 각 인스턴스 (fiddle)

function test() { 
    this.style.fontWeight = "bold"; 
} 

window.onload = function(){ 
    // add your method to existing elements with class 'extended' 
    var elements = document.getElementsByClassName('extended'); 
    for (var i = 0; i < elements.length; i++){   
     elements[i].test = test; 
    } 
    // just to visualize what happened... 
    var spans = document.getElementsByTagName("span"); 
    alert("span[0].test: " + typeof spans[0].test 
      +"\nspan[1].test: " + typeof spans[1].test); 
    spans[0].test(); 
}; 
+0

이 작동하지만 프로토 타입 체인을 느슨하게하고 싶지 않습니다. 따라서 테스트 함수를 변경해야하는 경우 "확장 된"클래스로 모든 요소에 대해이 함수를 배포해야합니다. 프로토 타입 체인이 작동하는 솔루션을 찾고 있었기 때문에 일부 공유 메서드와 속성을 한 번에 변경할 수 있습니다. 감사합니다 – Luckylooke

0

업데이트 할 수있는 방법을 추가하지

이 방식을 사용하면 확장 메서드를 정의하는에 글로벌 인터페이스를 정의한다. 이와 같이 인터페이스 내부에두면 메소드를 다시 적용 할 필요없이 메소드를 변경할 수 있습니다.

MyExtendedInterface = { 
    test: function() { 
     // this points to the DOM element itself 
     console.log(this); 
    } 
} 

var elements = document.getElementsByClassName('extended'); 
for (var i = 0, el; el = elements[i]; ++i) { 
    for (var j in MyExtendedInterface) { 
     // bind the interface methods to the current element 
     el[j] = MyExtendedInterface[j].bind(el); 
    } 
} 

.bind() 자바 스크립트에 최근에 추가; 참조 : https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

+0

@ Luckylooke 나는 대답을 업데이 트했습니다, 이것이 당신이 더 좋아할 것이라고 희망합니다 :) –

+0

나는 당신의 스 니펫으로 먼저 테스트를해야합니다. 그 동안 나는 흥미있는 부분적인 대답을 발견했다 [여기] (http://stackoverflow.com/questions/1489738/how-to-inherit-from-the-dom-element-class) 그리고 가장 흥미로운 대답은 kangax에서 그리고 그는 끝에 래퍼 또는 데코레이터 패턴을 쓰고있었습니다. 그러나이 패턴이이 경우 어떻게 사용되어야하는지 궁금합니다. – Luckylooke

관련 문제