Страницы: 1
Задача.
Сделать кнопку в нижней части окна 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)
Отсутствует
ksfinks
ну у тебя же iterateNext()
как функция отсутствует в коде
а вдругих работает потому что она гдето ещё присутствует.. поищи в файлах
function iterateNext() {блаблабла}
и вставь эту функцию в свой код
iterateNext() - метод объекта iter, который имеет тип XPathResult. Если бы библиотека ХPath не поддерживалась, то и document.evaluate не выполнялся бы. Он же выполняется и в iter есть какое-то не null значение
Отредактировано ksfinks (22-11-2009 14:52:21)
Отсутствует
ksfinks
Там документ совсем не тот.
Попробуйте заменить document на content.document, а window.open() – на gBrowser.addTab().
Ну, и лучше curr.href вместо curr.getAttribute('href').
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
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 (23-11-2009 15:40:33)
Отсутствует
В результате 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)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Здравствуйте. У меня снова вопрос.
Как в коде 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)
Отсутствует
Код такой:
Выделить кодКод:
br.contentDocument.forms[0].getElementsByTagName('select')[0].value = значение из textbox
Кажется, вы путаете атрибут 'value' и свойство 'value', на самом же деле хотите примерно вот чего:
Отсутствует
luitzen, тут именно атрибут. Смысл кода в том, чтобы при загрузке страницы в списке br.contentDocument.forms[0].getElementsByTagName('select')[0] выбирался элемент со значением из textbox.
Пока я устанавливаю его в ручную:
все работает нормально. Но при этом мне каждый раз приходится менять код расширения и перезапускать firefox. Хотелось бы, чтобы нужное значение бралось из textbox
Отсутствует
Ой, ну и ересь я написал в прошлый раз . Имелось в виду вот что:
Но если наоборот, то вот так, наверное:
Вместо "this" подставьте что нужно.
Отредактировано luitzen (06-04-2010 15:16:09)
Отсутствует
Страницы: 1