Страницы: 1
Допустим есть HTML-страница:
<html><head> <script type="text/javascript"> var variable1 = 'variable1Value'; var variable2 = 4; var variable3 = new Array('elem1', 'elem2'); </script> </head> <body> ... </body> </html>
Как из расширения получить значения переменных (variable1, variable2, ...) на этой странице?
Конструкция window._content.variable1 не помогает.
Расширение перекрывает browser.xul
Кому ничего не надо, с того нечего и потребовать.
©Генри Филдинг
Отсутствует
doc.defaultView, где doc - ссылка на документ страницы.
Расширение перекрывает browser.xul
это как понимать?
!
Отсутствует
alert(window._content.document.defaultView.variable1);
Выводит undefined. Может быть "синтаксис" не такой?
Кому ничего не надо, с того нечего и потребовать.
©Генри Филдинг
Отсутствует
это как понимать?
overlay
Закрой кран
Включи свет ©
Fire! Kill IE is your desire | NULL | NULL
Отсутствует
Tearis, DOM инспектором ковырялся? я что-то никакого _content у основного окна не нахожу. а вот в defaultView документа он имеется.
!
Отсутствует
Dark-Demon
Какая разница между тем, что написал Tearis:
alert(window._content.document.defaultView.variable1);
и тем, что написал ты:
alert(_content.document.defaultView.variable1);
?
Tearis
Тут всё дело в безопасности.
Напрямую получать доступ к свойствам веб-страниц небезопасно.
Поэтому вместо
alert(content.variable1);
нужно использовать
alert(content.wrappedJSObject.variable1);
Но при этом это будет небезопасный доступ к variable1.
Почитать об этом можно тут:
http://developer.mozilla.org/en/docs/XPCNativeWrapper#Accessing_unsafe_properties
http://developer.mozilla.org/en/docs/Safely_accessing_content_DOM_from_chrome
http://kb.mozillazine.org/XPCNativeWrapper
Отсутствует
Yan
Спасибо, то что нужно
Добавлено Срд 08 Ноя 2006 20:13:35 :
Вопрос уже не конкретно по теме, но косвенно к ней относящийся.
Почему нельзя использовать _content.document.defaultView. для этой цели? Ведь тут тоже проблем с перекрытием имен не должно оказываться (если я правильно понял о какой безопасности идет речь на приведенных страницах).
Кстати, как-то я в обычном скрипте на странице объявил переменную (допустим myVar) и мне консоль JavaScript сказала что "переназначение const myVar, ошибка". Странно, если говорят, что подобное пофиксили еще в версии Firefox 1.0.3 (вроди бы это написано на http://kb.mozillazine.org/XPCNativeWrapper).
Отредактировано Tearis (08-11-2006 20:14:49)
Кому ничего не надо, с того нечего и потребовать.
©Генри Филдинг
Отсутствует
Tearis
Почему нельзя использовать _content.document.defaultView. для этой цели? Ведь тут тоже проблем с перекрытием имен не должно оказываться (если я правильно понял о какой безопасности идет речь на приведенных страницах).
То, что доступ к небезопасным свойствам веб-страниц усложнён -- это хорошо, т.к. если программист и обращается к небезопасным объектам, то он безусловно знает, что делает -- принудительное использование wrappedJSObject послужит хорошим напоминанием.
А _content.document.defaultView. использовать можно, но только для обращения к безопасным (неперекрытым) объектам.
Пример:
На HTML-странице перекрываем метод createElement документа:
<html><head> <script type="text/javascript"> document.createElement = ' метод изменён'; </script> </head> <body> ... </body> </html>
А потом из расширения проверяем, что нам выдадут различные способы обращения к createElement:
alert('безопасный доступ:'+content.document.createElement); alert('НЕбезопасный доступ:'+_content.document.defaultView.document.wrappedJSObject.createElement); alert('НЕбезопасный доступ:'+content.document.wrappedJSObject.createElement);
В общем, примерно так я считаю. Могу ошибаться, конечно.
Кстати, как-то я в обычном скрипте на странице объявил переменную (допустим myVar) и мне консоль JavaScript сказала что "переназначение const myVar, ошибка"
Правильно. Если переменная уже объявлена, то её нельзя переназначать.
Простейший пример:
вызовет такую же ошибку. Это с вышеизложенными случаями про безопасность никак не связано.
Отсутствует
Правильно. Если переменная уже объявлена, то её нельзя переназначать.
Я не первый день web-программированием занимаюсь Естественно я не объявлял нигде выше на странице константу "myVar". В IE и Opera все было нормально.
Кому ничего не надо, с того нечего и потребовать.
©Генри Филдинг
Отсутствует
Tearis
Значит, переменная myVar у window уже была изначально. Ничего другого быть не может.
Воспроизвести мне такую же ошибку удалось только при попытке переопределить существующие переменные как константы:
Кстати, в Опере как раз alert(typeof window.console) выдаёт undefined, а в Firefox Object.
Отсутствует
Возник соответствующий теме вопрос.
Допустим я ловлю событие "DOMContentLoaded" и получаю ссылку на document той страницы которая инициировала это событие.
window.addEventListener('DOMContentLoaded', function(e){ var doc = e.target; }, false);
Как мне операясь на "doc" получить доступ к переменным конкретно этой страницы?
Я пробовал что-то типа:
doc.defaultView.window.content.wrappedJSObject.variable1
Работает, но не до конца правильно. В момент возниконовения события "DOMContentLoaded" сценарий пытается достать "variable1" со страницы в той вкладке, которая была активна на момент возникновения события, а она, страница, не обяательно та что нужна.
Кому ничего не надо, с того нечего и потребовать.
©Генри Филдинг
Отсутствует
Tearis
Во-первых, addEventListener, надо применять не к window, а к tabbrowser (его возвращает функция getBrowser()), а во-вторых, зачем так сложно:
doc.defaultView.window.content.wrappedJSObject.variable1
?
У меня успешно работает вот такой пример, заточенный под страницу этого форума:
getBrowser().addEventListener('DOMContentLoaded', function(e){ var x=e.target.defaultView.wrappedJSObject.google_color_text; alert(x?x:'переменная не определена -- не та страница'); }, false);
При загрузке страницы выдаёт "000000" независимо от того, какая вкладка активна в момент загрузки.
Отсутствует
столкнулся с этим XPCNativeWrapper. ужасная вещь
может кто-нибудь объяснить мне каким образом мне добраться скажем до
документа? бюсь уже много времени, но реализовать не могу...
пример
var winWrapper = new XPCNativeWrapper(content, "document", "getSelection()"); var docWrapper = new XPCNativeWrapper(winWrapper.document, "title"); return docWrapper.title == winWrapper.getSelection();
с http://developer.mozilla.org/en/docs/XPCNativeWrapper у меня работает
Отсутствует
Наверное, так:
var winWrapper = new XPCNativeWrapper (content, "document"); var docWrapper = new XPCNativeWrapper (winWrapper. document, "getElementById()"); var siWrapper = new XPCNativeWrapper (docWrapper. getElementById ("search-input"), "value"); var sivWrapper = siWrapper. value;
Добавлено Сбт 18 Авг 2007 13:20:26 :
p.s. хотя, там написано
This syntax has been kept for compatibility with versions prior to Firefox 1.5.
А в более поздних версиях можно короче:
var winWrapper = new XPCNativeWrapper (content);
var docWrapper = winWrapper. document;
var siWrapper = docWrapper. getElementById ("search-input");
var sivWrapper = siWrapper. value;
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Страницы: 1