__defineGetter__ в расширении Firefox не определен

#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. Вероятно, одна из всех этих оболочек просто «съедает» его.