Страницы: 1
спасибо большое! проблема решена
а задание xpcnativewrappers=no оказалось забавным - оно сделало document без обертки, но window все же оставался с оберткой. Совет Anton'a помог решить и это.
Да, пробовал, и с задержкой, но и тогда, когда вся страница уже загружена ничего не находится.
Я думаю что дело в следующем http://developer.mozilla.org/en/docs/XP … iveWrapper
Согласно пункту 1 нельзя устанавливать обработчики. Аналогично, как я понял, нельзя получить доступ и к переменным и объектам.
Однако тот же FireBug в консоли спокойно работает со всем этим добром... Как??
updated
в файле chrome.manifest в папке расширения firebug была обнаружена строчка:
content firebug jar:chrome/firebug.jar!/content/firebug/ xpcnativewrappers=no
видимо поэтому и не используются обертки и файрбаг спокойно работает со всем добром внутри страницы. А где я должен это прописать?
Не подскажете, как можно обратиться к яваскрипту на загруженной странице?
Например там есть объект window.dojo (window странички, не из-под chrome), а в расширении я до этого dojo достучаться не могу. Аналогично не могу установить и window.onload. Вернее оно не срабатывает.
Объект window получаю так: getBrowser().selectedBrowser.contentWindow. Не знаю, правильно ли это...
ХХА! Я тупил. Пытался в yahoo.com почте выбрать папку Spam. Код для каждой папки там такой:
<tr style="display: table-row;" onmouseup="Jo(event,this);" onmouseover="w2(event,this);" class="folderRow axsTreeitem axsSelectable" title="Spam contains 0 messages"> <td class="folderCell" style="display: table-cell;" nowrap="nowrap"> <div style="position: relative;"> ... <span class="folderNameElem" id="_test_%40B%40Bulk" style="left: 36px;">Spam</span> ... </div> </td> </tr>
И я слал click полагая, что он будет расценен как последовательность событий mousedown, mouseup, click (как это бывает в системном программировании), однако сейчас послал конкретно mouseup и все заработало.
Всем большое спасибо за желание помочь.
…На написанное в консоле (неважно click() или onclick()):
Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow("navigator:browser").getBrowser().selectedBrowser.contentWindow.document.getElementById('_test_Sent').onclick()
Выдается:
Ошибка: Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow("navigator:browser").getBrowser().selectedBrowser.contentWindow.document.getElementById("_test_Sent").onclick is not a function
Еще раз упоминаю о том, что элемент - не кнопка или ссылка, а тег <span>.
Кстати, что интересно, искать элемент с id = "_test_%40B%40Bulk" этот код вообще отказывается, выдавая null, хотя в расширении он его успешно находит.
Ну а все же, может есть способ вызвать js-функцию определенную на самой странице?
…только onclick() :D
хорошо, как правильно обратиться к ее document? getBrowser().contentDocument ? не работает...
ты проверял код в chrome или только в коде страницы? если только в коде страницы, то там и приведенный мной выше код с dispatchEvent работает... А тут выдает на onclick():
Ошибка: [Exception... "Component is not available" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: chrome://mhookforms/content/actions.js :: getFolderLinks :: line 127" data: no]
getFolderLinks - это та функция в которой этот код размещен
Ошибка: spamLink.click is not a function
Насколько я знаю, этот метод есть только под IE. Дело осложняется тем, что нужно кликнуть не на ссылку а на элемент <span>.
На странице это нажатие должна обработать некая функция Jo(event, target). Я ведь могу передать в нее найденный элемент и созданное событие, вот только как ее вызвать? Просто Jo окончилось неудалчей...
Пытаюсь послать событие из под chrome (перекрывает browser, navaigator), так:
var win = window._content.document; var spamLink = win.getElementById('_test_%40B%40Bulk'); var mouseEvent = win.createEvent("MouseEvent"); mouseEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); spamLink.dispatchEvent(mouseEvent);
Но оно не посылается, делал addEventListener для spamLink и оно не сработало. Как выполнить щелчок по ссылке?
(не переход на другую страницу, а именно щелчок!)
PS: возможно проблема в 4м аргументе initMouseEvent, но как тогда получить объект окна загруженной страницы?
I'll be back )
По некоторым причинам получилось что мен надо все же ловить событие полной загрузки страницы - с картинками, флешем и т.п. Ясное дело, DOMContentLoaded срабатывает до всего этого. А ловя событие load я не могу узнать url загруженной страницы.
Если бы была одна вкладка, то и ладно - ясно что за страница, но вкладок много и грузятся страницы и их контент ясное дело не последовательно.
Выручите, а? Может есть способ получить url из события load?
Прошу прощения, когда же я, блин, буду внимательно читать чужие мессаги
спасибо, все получилось, главное - надо было использовать событие DOMContentLoader, а не load.
вы хотите выполнить код (получить урл) при загрузке определённого таба браузера?
почему же вы тогда вешаете обработчик на window? в каком chrome выполняется скрипт?
какие табы вы имеете ввиду в первом посте?
1. не определенного, а любого. а уж урл конечно того, который загрузился.
2. куда вешать? перекрывается browser.xul и navigator.xul
3. ммм... Вкладки. Если в одном окне фокса открыто две страницы, то будут две вкладки. Вы меня в тупик поставили, какие еще табы бывают?
если правильно понял вопрос - в расширении. Код примерно такой (лишнее обрезано):
function actions() { this.doLoad = doLoad; function doLoad(ev) { // here we are :) } } var actions = new actions(); window.addEventListener("load", actions.doLoad,true);
По событию onload надо получить url загруженной страницы.
Обращаться просто к window._content.document.location не решение из-за следующей проблемы:
если открыть несколько вкладок и нажать (re)load на первой, а потом, до загрузки страницы перейти на вторую закладку, то window._content.document.location вернет адрес второй страницы.
Если я правильно понимаю достичь желаемого можно используя event в обработчике onload, только я не пойму как :blush:
пысы: поиском пользовался, ничего не нашел, так что если было - не бейте, а дайте ссылку
Кто знает как можно выполнить код на ява скрипте в компоненте?
смотрю на http://www.xulplanet.com/references/xpc … cript.html, пытаюсь разобраться, но как-то нехватает описаний (выдает 404) nsIScriptElement и nsIDocument. Смотрел описание nsIScriptElement.h, и так понял, что этот компонент может только выдавать содержимое скрипта, но присвоить и выполнить его не может.
Если правильно понял это должен делать nsIScriptLoader.processScriptElement, но что ему передать, хз...
:/ и снова я со всем разобрался... нужно было использовать в idl тип DOMString, а в cpp - nsEmbedString
:/ эх... все получилось, работает отлично (если кому надо научу как :) ), доступ к DOM-структуре тоже получен, казалось бы все хорошо.
НО. нужно чтобы экспортируемая функция возвращала не число там какое-нибудь, а самую что ни на есть строку. Пока сделать этого не получается, передается указатель (char*), а не строка. Делать возвращаемый тип фиксированной длины я тоже не хочу, т.к. в будущем должны отдаваться строки произвольной длины...
как сделать, а?
читал материал:
http://forum.mozilla-russia.org/doku.php?id=development:extension:mozilla
расширения делать получается, проблем нет. с xpcom - проблема. если кто-то выполнял этот пример, ответьте, плиз, gecko-sdk какой версии юзали?
я скачал 1.7. Но к сожалению в нем не было nspr4.lib, поэтому скомпилировать в VCpp6 не удалось. скачал 1.8. пробовал скомпилировать в нем - ошибка на стадии линковки. Тогда (как мне кажется бредовое действие) я скопировал nspr4.lib из 1.8 в 1.7 и скомпилировал. Удачно.
Далее пробовал зарегистрировать согласно разделу "Установка для Mozilla". Проблем не возникло, но пример на html идущий в составе xpcom-sample.zip не заработал (возможно потому что у меня FF 2.0.0.6).
Может у кого-то есть опыт разработки xpcom компонент, помогите советом! Очень-очень надо.
Страницы: 1