>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Как добраться до DOM загруженной страницы из расширения? http://forum.mozilla-russia.org/viewtopic.php?id=7668 |
Sarin2.0 > 18-01-2006 14:46:13 |
Только начал осваивать разработку расширений для FF. Вот вопрос: как добраться до загруженной страницы? До её DOM. Конкретно надо будет прочитать, обработать и изменить textNode вложенный в некоторые элементы. |
alc > 18-01-2006 16:41:09 |
http://xpoint.ru/forums/programming/XUL/thread/33865.xhtml |
Sarin2.0 > 18-01-2006 17:49:42 |
Спасибо. Возник ещё вопрос. Допустим в документе имеется форма. В форме поле ввода. Когда скрипт пишется для страницы там можно доступ к полю ввода получить примерно так: document.form[0].textarea[0]. Или по имени если оно известно. Можноль как-то сделать так же из расширения? |
alc > 18-01-2006 18:18:27 |
Выделить код Код:var myExVar = { getContent: function() { var cont = getBrowser().contentWindow; try { cont = new XPCNativeWrapper(cont).wrappedJSObject; } catch(e) { return 0} if (!cont) cont = getBrowser().contentWindow; return cont; }, execute: function() { var doc = this.getContent().document; alert(doc.form[0]);//вот вам и форма } } myExVar.execute(); |
Sarin2.0 > 18-01-2006 18:39:56 |
Чёт не хочет. |
Sarin2.0 > 18-01-2006 18:51:09 |
Вообще где можно найти скольконибудь нормальное пособие по разработке расширений к FF на русском? А то везде долго и нудно пишут про великий XUL, а потом вскользь упоминают, что осталось только написать код на JS. А сделать это не проблема. Надо только JS знать. |
igorsub > 18-01-2006 19:17:40 |
У меня такая же фигня. JS все испортил. |
Sarin2.0 > 18-01-2006 20:55:07 |
igorsub пишет
Фишка в том, что знать язык чтоб писать на нём не достаточно. Что я расширения писать буду чтоб двойку с двойкой складывать? |
Anton > 18-01-2006 22:44:21 |
Sarin2.0 пишет
См. "прибитые" в этом разделе темы. Вообще говоря, разработка js-кода расширений подобна разработке js-кода html-страниц. Разница лишь в структуре документа - js-код html-страницы получает доступ к элементам через document, а js-код расширения - через window. contentDocument (если для текущей вкладки). |
Sarin2.0 > 18-01-2006 22:46:40 |
Anton пишет
И это всё? Я JS знаю неплохо. С DOM работал. |
Anton > 18-01-2006 23:02:53 |
Sarin2.0 пишет
А что ещё нужно ? Ведь
Тем более, как говорится "карты в руки". Получаешь контент (window. content или window. contentDocument или как там ещё, не помню) и с помощью DOM API находишь нужную форму, в ней - нужный textarea и работаешь с ним. |
Sarin2.0 > 18-01-2006 23:13:16 |
Через DOM косячит. TextNode добавляется. Но вот работать с этим текстом тяжело. Как оказалось текст введённый пользователем не является TextNode, а через getAttribute('value') не получаетца. |
Коля Дубр > 18-01-2006 23:22:44 |
Sarin2.0, я по началу тоже перепугался На самом деле все действительно просто. Как разбирался я: 1. Прочитал вот эту статью и сделал перевод. Перевод можно заменить трехкратным прочтением Основы в голове улеглись. 2. Прочитал ветку про XUL на xpoint. С самого начала. Там описаны решения всех новичковых проблем. Берем на заметку. 3. Проглядываем http://xulplanet.com/ на предмет "что там вообще есть". Начинаем что-то писать. Когда возникают технические вопросы - лезем на xulplanet и находим решение Еще полезно держать под рукой шпаргалку по XUL - благо она русскоязычная и там почти все есть. Поскольку периодически приходится перегружать chrome, лучше сразу открыть все маны и доки в опере 4. Мне лично очень помогает. Если нифига не получается, идем на xpoint задавать вопрос (помня, что люди там серьезные и дергать их по пустякам не стоит). Выкуриваем сигаретку и начинаем формулировать, в чем наша проблема. Подробно, со всеми нюансами. Обычно через 5 минут удается найти решение, т.к. правильно сформулированный вопрос содержит половину ответа 5. Advanced. Достаем куда-нибудь содержимое архива C:\Program Files\Mozilla Firefox\chrome\browser.jar, особенно нас интересует папка browser. В ней лежит весь интерфейс, который мы переопределяем. Очень полезно его изучить. 6. Самый простой способ внедрить какую-то фичу - вспомнить расширение, где реализованно что-то подобное. Распаковать и посмотреть, как это сделано.
Готов согласиться с этим утверждением. |
Anton > 18-01-2006 23:24:08 |
Sarin2.0 пишет
Это не "косячит". Это значит textnode там действительно есть. Это значит что код страницы отформатирован примерно так: Если бы он был написан так: то не было бы никаких textnode.
В смысле ? У textnode нет атрибута value ? |
Sarin2.0 > 18-01-2006 23:31:34 |
Знаю. Я не про тектноде. Есть текстарея. Надо до неё добраться. Я говорил про свойство value этой тектареи. То самое, с которым можно через JS работать без всяких DOMов. Так вот нету его |
Anton > 18-01-2006 23:42:05 |
Sarin2.0 пишет
А и точно нету Попробуй так: element. value, где element - найденный textarea. |
Anton > 18-01-2006 23:43:36 |
ps: вот мой код, "заточенный" для формы ответа этого форума: Выделить код Код:function getTopWin () { var windowManager = Components. classes ['@mozilla.org/appshell/window-mediator;1']. getService(); var windowManagerInterface = windowManager. QueryInterface (Components. interfaces. nsIWindowMediator); var topWindowOfType = windowManagerInterface. getMostRecentWindow ("navigator:browser"); if (topWindowOfType) { return topWindowOfType; } return null; } function getContent () { var cont = getTopWin (). getBrowser (). contentDocument; var c2 = cont; try { cont = new XPCNativeWrapper (cont). wrappedJSObject; } catch(e) {} if (!cont) cont = c2; return cont; } var x = getContent (); var f = x. getElementById ("post"); var i = f. getElementsByTagName ("textarea"); for (var j = 0; j < i. length; j++) if (i [j]. name == "req_message") print (i [j]. value); |
Sarin2.0 > 18-01-2006 23:50:51 |
Anton пишет
Феноменально. Работает. Но ведь не должно! В любом случае я тестил на простом ХТМЛе. Свой тулбар я поломал и чинить его долго (см. соседний топик про манифест) Вот что работает: Выделить код Код:<script> function f(){ alert(document.getElementById('txt')); text = document.createTextNode('Yo'); document.getElementById('txt').appendChild(text); } function f2(){ alert(document.getElementById('txt').value); } </script> <textarea id="txt"> </textarea> <input type="button" onclick="f();" value="123"><input type="button" onclick="f2();" value="321"> |