«документ» против «контент.документ» - PullRequest
5 голосов
/ 15 августа 2011

Я пытаюсь написать расширение Firefox, которое добавляет элементы на загруженную страницу. Пока что я получаю корневой элемент документа через

var domBody = content.document.getElementsByTagName("BODY").item(0);

и создайте новые элементы с помощью

var newDiv = content.document.createElement("div");

и все работало довольно хорошо, на самом деле. Но проблемы возникли, когда я добавил кнопку с атрибутом onclick. Пока кнопка отображается правильно, я получаю сообщение об ошибке. Я уже спросил, спросил здесь , и ответ с document.createElement () (без содержимого) работает.

Но если я уберу «контент». везде начинаются настоящие неприятности. Во-первых, domBody имеет значение null / undefined, независимо от того, как я пытаюсь получить к нему доступ, например, document.body (И фактически я добавляю все элементы _after_, документ полностью загружен. По крайней мере, я так думаю). А во-вторых, все остальные элементы выглядят по-разному. Кажется, информация о стиле, например, element.style.width = "300px", больше не учитывается.

Короче говоря, с 'content.document' все выглядит хорошо, но button.onclick выдает ошибку. при использовании только «документа» кнопка работает, но элементы больше не отображаются правильно. Кто-нибудь видит решение для этого.

Ответы [ 2 ]

4 голосов
/ 15 августа 2011

Это должно работать нормально, если вы используете addEventListener [MDN] (по крайней мере, это то, что я использовал). Я где-то читал (я буду искать), что вы не можете прикрепить прослушиватель событий через свойства при создании элементов в коде Chrome.

Вы все равно должны использовать content.document.createElement, хотя:

 Page = function(...) {
   ...
 };

 Page.prototype = {
   ...
   addButton : function() {
     var b = content.document.createElement('button');
     b.addEventListener('click', function() { 
         alert('OnClick'); 
     }, false);
   },
   ...
 };

Я бы хранил ссылку на content.document где-то между прочим.

3 голосов
/ 16 августа 2011

Существующий ответ не имеет реального объяснения, и там уже слишком много комментариев, поэтому я добавлю еще один ответ.Когда вы обращаетесь к документу с контентом, вы не обращаетесь к нему напрямую - из соображений безопасности вы получаете к нему доступ через оболочку , которая предоставляет только действительные методы / свойства DOM и скрывает все, что мог добавить JavaScript на странице.У этого есть побочный эффект, что свойства как onclick не будут работать (это фактически первая точка в списке ограничений XPCNativeWrapper ).Вы должны использовать addEventListener вместо этого.Это дает дополнительное преимущество, заключающееся в том, что может сосуществовать более одного прослушивателя событий, например, веб-страница не удалит ваш прослушиватель событий, установив onclick.

Примечание: ваш сценарий выполняется в окне браузера,поэтому document - это документ XUL, содержащий пользовательский интерфейс браузера.Нет элемента <body>, потому что в XUL-документах его нет.И добавление кнопки не повлияет на страницу в выбранной вкладке, только испортит пользовательский интерфейс браузера.Глобальная переменная content относится к объекту window выбранной в данный момент вкладки, так что это ваша точка входа, если вы хотите работать с ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...