2014-06-20 14 views
0

정의되지 않는다 :__defineGetter__가 나는 파이어 폭스 확장 기능의 XUL은 iframe에 게터를 정의하려고

// iframe is an XUL iframe element 
iframe.contentDocument.defaultView.HTMLElement.prototype.__defineGetter__("node", function() { 
    return this.nodeName; 
}); 

나는 iframe.contentDocument.defaultView.HTMLElement.prototype하지만 __defineGetter__이 정의되지 액세스 할 수 있습니다.

Object.defineProperty이 작동하지만 생성 된 각 요소에 대해이를 정의해야합니다.

HTMLElement.prototype.__defineGetter__ 사용할 방법이 있습니까? __defineGetter__이 정의되지 않은 이유는 무엇입니까?

답변

1

Object.defineProperty이 작업은 생성 된 각 요소에 대해 정의해야합니다.

Object.defineProperty(
    iframe.contentDocument.defaultView.HTMLElement.prototype, 
    node, 
    ... 
); 

왜 정의되지 않은 __defineGetter__입니다 :

아니, 당신은 단지 프로토 타입 객체에 속성을 정의?

MDN documenation에서 읽을 수 있듯이 __definedGetter__은 ECMAScript의 표준 기능이 아닙니다. 또한 HTMLElement호스트 개체이며 사양을 따를 필요가 없습니다.


그것은 이전 기사, 그러나 여전히 읽기 가치가있을 수도 있습니다 : 이것은 가능성이 크롬 사이 (부/보안 경계 랩퍼를 작성하고 액세스하게됩니다있는 모든 래퍼 및 expandos와 What's wrong with extending the DOM

+0

네, Object.defineProperty (iframe.contentWindow.HTMLElement)를 사용해 보았습니다. 그러나 내 확장 기능에서는 작동하지 않았습니다. – Mircea

1

컨텍스트 및 콘텐츠 컨텍스트, DOM 요소 래퍼, 아마도 다른 것들) 이것은 단지 진짜 버그 일 수 있습니다. 또한 __defineGetter__은 비표준이므로 어쨌든 피해야합니다.

Object.defineProperty을 사용할 수 있습니다. 약식 테스트를 수행하면 작동하는 것 같습니다.

Object.defineProperty(iframe.contentWindow.HTMLElement.prototype, "node", { 
    "get": function() { 
    return this.nodeName; 
    } 
}); 

은 당신이 (호환성을 위해)하는 방식으로 연장하고 자신의 코드가 아닌 경우 강력하게 권장하지 않습니다 내장 객체의 프로토 타입을 확장,이 말을하는 데, 심지어 부정 AMO가 발생할 수 있습니다 너는 전체 리뷰.

+0

고마워요. 실제로 컨텐츠 컨텍스트에서는 작동하지만 내 확장은 어떤 이유로 실패합니다. 당신은 연장에서 그것을 시도 했습니까? – Mircea

+0

아마도이 모든 래퍼 중 하나가 "먹습니다". – nmaier

+0

:) 이것이 작동해야한다고 생각했습니다. – Mircea