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

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

№107-11-2006 18:33:55

Tearis
Участник
 
Группа: Members
Откуда: Воронеж
Зарегистрирован: 18-12-2005
Сообщений: 115

Получить значения переменных на странице

Допустим есть 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


Кому ничего не надо, с того нечего и потребовать.
©Генри Филдинг

Отсутствует

 

№207-11-2006 19:52:18

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Получить значения переменных на странице

doc.defaultView, где doc - ссылка на документ страницы.

Расширение перекрывает browser.xul

это как понимать?


!

Отсутствует

 

№307-11-2006 21:09:19

Tearis
Участник
 
Группа: Members
Откуда: Воронеж
Зарегистрирован: 18-12-2005
Сообщений: 115

Re: Получить значения переменных на странице

alert(window._content.document.defaultView.variable1);

Выводит undefined. Может быть "синтаксис" не такой?


Кому ничего не надо, с того нечего и потребовать.
©Генри Филдинг

Отсутствует

 

№408-11-2006 04:43:10

INFOMAN
Телепаты в отпуске
 
Группа: Extensions
Откуда: Кишинев
Зарегистрирован: 31-12-2005
Сообщений: 1099
Веб-сайт

Re: Получить значения переменных на странице

это как понимать?

overlay


Закрой кран
Включи свет ©
Fire! Kill IE is your desire | NULL | NULL

Отсутствует

 

№508-11-2006 12:40:54

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Получить значения переменных на странице

Tearis, DOM инспектором ковырялся? я что-то никакого _content у основного окна не нахожу. а вот в defaultView документа он имеется.

Выделить код

Код:

alert(_content.document.defaultView.variable1);

!

Отсутствует

 

№608-11-2006 16:53:24

Yan
Участник
 
Группа: Extensions
Откуда: Москва
Зарегистрирован: 27-02-2005
Сообщений: 1019

Re: Получить значения переменных на странице

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

Отсутствует

 

№708-11-2006 19:59:27

Tearis
Участник
 
Группа: Members
Откуда: Воронеж
Зарегистрирован: 18-12-2005
Сообщений: 115

Re: Получить значения переменных на странице

Yan
Спасибо, то что нужно :D

Добавлено Срд 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)


Кому ничего не надо, с того нечего и потребовать.
©Генри Филдинг

Отсутствует

 

№809-11-2006 20:42:39

Yan
Участник
 
Группа: Extensions
Откуда: Москва
Зарегистрирован: 27-02-2005
Сообщений: 1019

Re: Получить значения переменных на странице

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, ошибка"

Правильно. Если переменная уже объявлена, то её нельзя переназначать.
Простейший пример:

Выделить код

Код:

var x=1;
const x=1;

вызовет такую же ошибку. Это с вышеизложенными случаями про безопасность никак не связано.

Отсутствует

 

№910-11-2006 00:06:33

Tearis
Участник
 
Группа: Members
Откуда: Воронеж
Зарегистрирован: 18-12-2005
Сообщений: 115

Re: Получить значения переменных на странице

Правильно. Если переменная уже объявлена, то её нельзя переназначать.

Я не первый день web-программированием занимаюсь :D Естественно я не объявлял нигде выше на странице константу "myVar". В IE и Opera все было нормально.


Кому ничего не надо, с того нечего и потребовать.
©Генри Филдинг

Отсутствует

 

№1010-11-2006 01:16:45

Yan
Участник
 
Группа: Extensions
Откуда: Москва
Зарегистрирован: 27-02-2005
Сообщений: 1019

Re: Получить значения переменных на странице

Tearis
Значит, переменная myVar у window уже была изначально. Ничего другого быть не может.
Воспроизвести мне такую же ошибку удалось только при попытке переопределить существующие переменные как константы:

Выделить код

Код:

const location='...';
const console='...';
/*и т.п.*/

Кстати, в Опере как раз alert(typeof window.console) выдаёт undefined, а в Firefox Object.

Отсутствует

 

№1126-12-2006 23:33:06

Tearis
Участник
 
Группа: Members
Откуда: Воронеж
Зарегистрирован: 18-12-2005
Сообщений: 115

Re: Получить значения переменных на странице

Возник соответствующий теме вопрос.

Допустим я ловлю событие "DOMContentLoaded" и получаю ссылку на document той страницы которая инициировала это событие.

Выделить код

Код:

window.addEventListener('DOMContentLoaded', function(e){
	var doc = e.target;
}, false);

Как мне операясь на "doc" получить доступ к переменным конкретно этой страницы?
Я пробовал что-то типа:
doc.defaultView.window.content.wrappedJSObject.variable1
Работает, но не до конца правильно. В момент возниконовения события "DOMContentLoaded" сценарий пытается достать "variable1" со страницы в той вкладке, которая была активна на момент возникновения события, а она, страница, не обяательно та что нужна.


Кому ничего не надо, с того нечего и потребовать.
©Генри Филдинг

Отсутствует

 

№1227-12-2006 00:10:14

Yan
Участник
 
Группа: Extensions
Откуда: Москва
Зарегистрирован: 27-02-2005
Сообщений: 1019

Re: Получить значения переменных на странице

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" независимо от того, какая вкладка активна в момент загрузки.

Отсутствует

 

№1327-12-2006 20:28:55

Tearis
Участник
 
Группа: Members
Откуда: Воронеж
Зарегистрирован: 18-12-2005
Сообщений: 115

Re: Получить значения переменных на странице

Yan
Огромное спосибо.


Кому ничего не надо, с того нечего и потребовать.
©Генри Филдинг

Отсутствует

 

№1417-08-2007 21:46:26

Shutnik
Участник
 
Группа: Extensions
Зарегистрирован: 12-11-2005
Сообщений: 3785

Re: Получить значения переменных на странице

столкнулся с этим XPCNativeWrapper. ужасная вещь :blush:

может кто-нибудь объяснить мне каким образом мне добраться скажем до

Выделить код

Код:

document.getTlementById("foo").value

документа? бюсь уже много времени, но реализовать не могу...
пример

Выделить код

Код:

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 у меня работает

Отсутствует

 

№1518-08-2007 13:17:31

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Получить значения переменных на странице

Наверное, так:

Выделить код

Код:

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ентов на части порвет !!!

Отсутствует

 

№1618-08-2007 13:52:54

Shutnik
Участник
 
Группа: Extensions
Зарегистрирован: 12-11-2005
Сообщений: 3785

Re: Получить значения переменных на странице

Anton
спасибо большое

Отсутствует

 

Board footer

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