Задача.

Сделать кнопку в нижней части окна 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 - все ссылки находятся.

okkamas_knife пишет

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

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

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

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

Infocatcher пишет

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

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

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

Снова нужна помощь.
Для того, чтобы понять как работать с вкладками немного модифицировал это расширение. Теперь по замыслу при щелчке на кнопке на всех открытых вкладках должно выполняться 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 пишет

В результате 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();
        }
    );
}

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

Как в коде 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 пишет

Код такой:

Выделить код

Код:

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

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

Выделить код

Код:

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

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

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

Выделить код

Код:

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

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

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

Выделить код

Код:

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

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

Выделить код

Код:

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

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