Полезная информация

В мире Mozilla происходит много интересных событий. Но вам не нужно постоянно посещать новостные сайты, чтобы быть в курсе всех изменений. Зайдите на ленту новостей Mozilla Россия.

№122-11-2009 13:56:23

ksfinks
Участник
 
Группа: Members
Зарегистрирован: 03-11-2009
Сообщений: 11
UA: Firefox 3.5

Проблема с написанием расширения для Firefox. Помогите, плиз.

Задача.

Сделать кнопку в нижней части окна firefox, с помощью которой можно будет открывать или все гиперссылки на странице или гиперссылки с определенным текстом.

Решение.

Взял в качестве примера HelloWorld отсюда http://design-challenge.mozillalabs.com/re...ension_bootcamp и переделал под свою задачу. Вот что получилось:

файл browser.xul

Выделить код

Код:

<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script type="application/javascript"
          src="chrome://submitExtension/content/browser-3.js"/>
  <statusbar id="status-bar">
    <button label="Submit!" insertafter="statusbar-display"
            oncommand="OpenTabs()"/>
  </statusbar>
</overlay>

файл browser.js

Выделить код

Код:

function OpenTabs() {
   
   var iter = document.evaluate("//a[.='[RU]']", document, null, XPathResult.ANY_TYPE, null);
   var curr = iter.iterateNext();
   while(curr)
    {
       // _console.log(curr.getAttribute('href'));
      window.open(curr.getAttribute('href'));
      curr = iter.iterateNext();
    }
    dump("Submitted!\n");
}

В результате при щелчке по кнопке Submit, описанной в browser.xul должны открываться вкладки по всем ссылкам с текстом [RU].

Проблема в том, что iter.iterateNext() почему-то возвращает null. Подскажите, в чем может быть ошибка?

P.s. Тот же код в скрипте для Greasemonkey работает.
P.P.S.  Путь //a[.='[RU]'] тоже верен. Проверял в XPather - все ссылки находятся.

Отредактировано ksfinks (22-11-2009 13:57:27)

Отсутствует

 

№222-11-2009 14:51:43

ksfinks
Участник
 
Группа: Members
Зарегистрирован: 03-11-2009
Сообщений: 11
UA: Firefox 3.5

Re: Проблема с написанием расширения для Firefox. Помогите, плиз.

okkamas_knife пишет

ksfinks
ну у тебя же iterateNext()
как функция отсутствует в коде
а вдругих работает потому что она гдето ещё присутствует.. поищи в файлах
function iterateNext() {блаблабла}
и вставь эту функцию в свой код

iterateNext() - метод объекта iter, который имеет тип XPathResult. Если бы библиотека ХPath не поддерживалась, то и document.evaluate не выполнялся бы. Он же выполняется и в iter есть какое-то не null значение

Отредактировано ksfinks (22-11-2009 14:52:21)

Отсутствует

 

№322-11-2009 18:34:59

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 3.5

Re: Проблема с написанием расширения для Firefox. Помогите, плиз.

ksfinks
Там документ совсем не тот.

Попробуйте заменить document на content.document, а window.open() – на gBrowser.addTab().
Ну, и лучше curr.href вместо curr.getAttribute('href').


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№422-11-2009 20:31:18

ksfinks
Участник
 
Группа: Members
Зарегистрирован: 03-11-2009
Сообщений: 11
UA: Firefox 3.5

Re: Проблема с написанием расширения для Firefox. Помогите, плиз.

Infocatcher пишет

ksfinks
Там документ совсем не тот.

Попробуйте заменить document на content.document, а window.open() – на gBrowser.addTab().
Ну, и лучше curr.href вместо curr.getAttribute('href').

Спасибо. Заработало.

Отсутствует

 

№523-11-2009 15:37:30

ksfinks
Участник
 
Группа: Members
Зарегистрирован: 03-11-2009
Сообщений: 11
UA: Firefox 3.5

Re: Проблема с написанием расширения для Firefox. Помогите, плиз.

Снова нужна помощь.
Для того, чтобы понять как работать с вкладками немного модифицировал это расширение. Теперь по замыслу при щелчке на кнопке на всех открытых вкладках должно выполняться submit() для форм на этих вкладках. (известно, что форму там гарантированное есть.).

Получился вот такой код browser.js (основан на примере отсюда https://developer.mozilla.org/en/nsIWindowMediator):

Выделить код

Код:

function SubmitTabs() {
   
   var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]  
                    .getService(Components.interfaces.nsIWindowMediator);  
 var enumerator = wm.getEnumerator("navigator:browser");  
 while(enumerator.hasMoreElements()) {  
   var win = enumerator.getNext();  
   // win is [Object ChromeWindow] (just like window), do something with it
   win.content.document.forms[0].submit();
   dump("Submitted!\n");
 } 

}

В результате submit выполняется, но только на выбранной вкладке. В чем может быть причина?. В примере написано: "This code iterates over all windows of the specified type".

Отредактировано ksfinks (23-11-2009 15:40:33)

Отсутствует

 

№623-11-2009 16:36:47

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 3.5

Re: Проблема с написанием расширения для Firefox. Помогите, плиз.

ksfinks пишет

В результате submit выполняется, но только на выбранной вкладке. В чем может быть причина?. В примере написано: "This code iterates over all windows of the specified type".

Ну да, окна и перебираются – но не вкладки.

win.content ссылается на объект window внутри текущего элемента <browser>.

Выделить код

Код:

while(enumerator.hasMoreElements()) {
    var win = enumerator.getNext();
    win.gBrowser.browsers.forEach(
        function(br) {
            var doc = br.contentDocument;
            doc.forms[0].submit();
        }
    );
}

Отредактировано Infocatcher (23-11-2009 16:38:25)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№705-04-2010 14:59:14

ksfinks
Участник
 
Группа: Members
Зарегистрирован: 03-11-2009
Сообщений: 11
UA: Firefox 3.6

Re: Проблема с написанием расширения для Firefox. Помогите, плиз.

Здравствуйте. У меня снова вопрос.

Как в коде Javascript обращаться к свойствам элементов интерфейса?

Если конкретно, то есть такая проблема:

Добавил на панель состояния браузера кнопку и текстовое поле.

Выделить код

Код:

<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script type="application/javascript"
          src="chrome://submitExtension/content/browser_select.js"/>
  <statusbar id="status-bar">
    <button label="Submit!" insertafter="statusbar-display"
            oncommand="SelectOptions()"/>
    <textbox id="GroupId" insertafter="statusbar-display" value="Enter GroupId here"/>
  </statusbar>
</overlay>

Теперь мне нужно использовать текст из textbox в коде Javascript. Как это сделать?

Код такой:

Выделить код

Код:

br.contentDocument.forms[0].getElementsByTagName('select')[0].value
   = значение из textbox

Отредактировано ksfinks (05-04-2010 15:01:01)

Отсутствует

 

№805-04-2010 19:01:13

luitzen
Участник
 
Группа: Members
Зарегистрирован: 19-07-2008
Сообщений: 791
UA: Firefox 3.6

Re: Проблема с написанием расширения для Firefox. Помогите, плиз.

ksfinks пишет

Код такой:

Выделить код

Код:

br.contentDocument.forms[0].getElementsByTagName('select')[0].value
   = значение из textbox

Кажется, вы путаете атрибут 'value' и свойство 'value', на самом же деле хотите примерно вот чего:

Выделить код

Код:

this.setAttribute('value') = this.value;

Отсутствует

 

№906-04-2010 14:07:47

ksfinks
Участник
 
Группа: Members
Зарегистрирован: 03-11-2009
Сообщений: 11
UA: Firefox 3.6

Re: Проблема с написанием расширения для Firefox. Помогите, плиз.

luitzen, тут именно атрибут. Смысл кода в том, чтобы при загрузке страницы в списке br.contentDocument.forms[0].getElementsByTagName('select')[0] выбирался элемент со значением из textbox.

Пока я устанавливаю его в ручную:

Выделить код

Код:

br.contentDocument.forms[0].getElementsByTagName('select')[0].value   = "55555";

все работает нормально. Но при этом мне каждый раз приходится менять код расширения и перезапускать firefox. Хотелось бы, чтобы нужное значение бралось из textbox

Отсутствует

 

№1006-04-2010 15:15:05

luitzen
Участник
 
Группа: Members
Зарегистрирован: 19-07-2008
Сообщений: 791
UA: Firefox 3.6

Re: Проблема с написанием расширения для Firefox. Помогите, плиз.

Ой, ну и ересь я написал в прошлый раз :). Имелось в виду вот что:

Выделить код

Код:

this.setAttribute('value', this.value);

Но если наоборот, то вот так, наверное:

Выделить код

Код:

this.value = this.getAttribute('value');

Вместо "this" подставьте что нужно.

Отредактировано luitzen (06-04-2010 15:16:09)

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]