#javascript #firefox #firefox-addon #xpcom
#javascript #firefox #firefox-аддон #xpcom
Вопрос:
Я пытаюсь определить средство получения в iframe XUL в расширении Firefox:
// 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, __definedGetter__
это не стандартная функция ECMAScript. Кроме того, HTMLElement
является объектом хоста и не должен соответствовать спецификации.
Это более старая статья, но, возможно, ее все же стоит прочитать: что не так с расширением DOM
Комментарии:
1. Да, я пробовал Object.defineProperty(iframe.contentWindow. HTMLElement и работал в скрипке, но, однако, в моем расширении этого не произошло.
Ответ №2:
Со всеми оболочками и расширениями, которые это, вероятно, приведет к созданию и доступу (оболочка с разделением / защитой между контекстом chrome и контекстом содержимого, оболочка элемента DOM, возможно, другие вещи), это может быть просто подлинной ошибкой. Кроме того, __defineGetter__
является нестандартным, и его следует избегать в любом случае.
Вы можете использовать Object.defineProperty
, и, похоже, это сработало, когда я провел беглый тест.
Object.defineProperty(iframe.contentWindow.HTMLElement.prototype, "node", {
"get": function() {
return this.nodeName;
}
});
Сказав это, настоятельно не рекомендуется расширять прототип встроенных объектов, если вы расширяете таким образом не свой собственный код (по соображениям совместимости), и это может даже привести к тому, что AMO откажет вам в полном обзоре.
Комментарии:
1. Спасибо, это действительно работает в контексте содержимого, но по какой-то причине не работает в моем расширении. Вы пробовали это в расширении?
2. Вероятно, одна из всех этих оболочек просто «съедает» его.