Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

[TWebbrowser+JS] Как проверить переменную js? [D7, XP]


Страницы:   1 2

vegarulez ©   (2016-07-28 11:44:00) 

Всем привет!
Подскажите как правильно проверять наличие переменной в загруженном документе в twebbrowser, а то если в одном документе она есть и к ней обращаюсь - то всё ок то в другом ее нет и ловлю исключение. Но проверять через исключение как-то не айс. А по другому как - не знаю. olevariant не получается проверить на Assigned. Подскажите каким образом это можно сделать?


procedure TFormMain.Webbrowser1CommandStateChange(Sender: TObject;
 Command: Integer; Enable: WordBool);
var
 document: IHTMLDocument2;
 V: olevariant;
begin
  Assert(Assigned(document));
   if Assigned(document) then
   try
     V := Webbrowser1.Document;
     V := V.parentWindow;
     if (VarToStr(V.prov_id) <> '') then
     begin
       prov_id := V.prov_id;
       btClick(Application);
       V.prov_id := '';
       prov_id := '';
     end;
except
     on E: Exception do
     begin
       MessageDlg('Webbrowser1CommandStateChange' + #10#13 + E.Message + #10#13 + inttostr(E.HelpContext), mtWarning, [mbOk], 0);
       document.clear;
     end;
   end;
end;


vegarulez   (2016-08-02 22:32:00) [1]

Вообщем нашел ответ как это сделать - т.к. браузер считывает html код и исполняет, то значит можно заменить все ' на
& # 3 9 ;
(убрать пробелы а то при сохранении в форуме браузер заменяет на ')
т.е. символы которые будет разбирать браузер в html  коде
например

onclick="javascript:void(alert(& # 3 9 ; Здесь открывается Группа GRP в БД:& # 3 9 ; +document.getElementById(& # 3 9 ; grppos1& # 3 9 ; ).getAttribute(& # 3 9 ; value& # 3 9 ; )))"


vegarulez   (2016-08-02 22:28:00) [2]

Вообщем нашел ответ как это сделать - т.к. браузер считывает html код и исполняет, то значит можно заменить все ' на 'т.е. символы которые будет разбирать браузер в html  коде
например
onclick="javascript:void(alert('Здесь открывается Группа GRP в БД:'+document.getElementById('grppos1').getAttribute('value')))"


vegarulez   (2016-07-29 19:45:00) [3]

Имелось ввиду при обработке

elem.innerHTML = '''+s+''' ;

когда значение s подставляется скобки накладываются  - и получается что ;не видит js при обработке


vegarulez   (2016-07-29 19:20:00) [4]

Столкнулся ещё с одной проблеммой - переменной в коде ниже она выделена жирным.
Из-за множества скобков (код внизу) - javascript не корректно в браузере обрабатывает выдавая ошибку: Предполагается наличие ';'
Ну не нравится ему столько скобок в одном месте - загружается ругается - если же убрать ''value'' -  onclick="setprov(this.getAttribute())" всё отрабатывает успешно - т.е. проблема именно в ''value''. Можно канеш выкинуть этот кусок целиком и получить тоже самое сделав просто onclick="setprov(2)" - но хочется то такую же структуру реализовать что и былав базовом HTML скелете, который перекладываю, хотя кто-то сейчас может возразить нафиг тебе это надо все равно в делфе формируешь - упрости и делай сразу onclick="setprov(2)" и не телебонь Моню...

но просто инетересно как браузеру это скормить без ругачки, при обработке javascript.


   Assert(Assigned(document));
   if Assigned(document) then
   try
     V := Webbrowser1.Document;
     V := V.parentWindow;
     s := '<div class="btmain clearfix" id="btpos1" value="2" onclick="setprov(this.getAttribute( ''value''))">Тесто Кнопка</div>';
     JSFn :='var elem = document.getElementById(''mainbt''); elem.innerHTML = '''+s+''';';
     V.execScript(JSFn, 'JavaScript');
   finally
     V:=null;
   end;


sniknik   (2016-07-29 10:43:00) [5]

> Вроде же олевариант
> V: olevariant;
тоже да не то, в этой переменной у тебя интерфейс, IHTMLDocument2 и "производные", и обращаешься ты посредством этой переменной к методу интерфейса... разница однако.
VarIsEmpty если бы ты проверял саму переменную, пустая она или нет, или "вытянутую" из интерфейса "наружу" в такой же вариант, это да. а вот когда есть ли у переменной доп поле/значение/метод (если это record/tobject/interface), ну т.е. что то внутри структуры (а не сама переменная), то это нет, тем еще до того как в VarIsEmpty  значение передастся экцепт выскочит.


vegarulez   (2016-07-29 07:43:00) [6]

>iop ©   (28.07.16 21:46) [18]
 
Вроде же олевариант
V: olevariant;


iop   (2016-07-28 21:46:00) [7]

дескать не хочите ексепшн юзайте VarIsEmpty - но при использовании вываливает тоже самое )



правильно написано.
но только не про то что ты имеешь ввиду спрашивая про олевариант.


vegarulez   (2016-07-28 21:33:00) [8]

>>sniknik ©   (28.07.16 16:15) [14]
спасибо за помощь.


vegarulez   (2016-07-28 21:32:00) [9]

>>sniknik ©   (28.07.16 16:15) [14]
Да, точно также хотел сделать костыль.
Если не определена переменна, определить принудительно.
V.execScript('if (typeof prov_id === ''undefined'') {prov_id='''';}', 'JavaScript');

Думал еще про другой вариант создать hidden input. И тогда можно опрашивать по getElementById и смотреть в ней переменную, запихивая ее туда. Соотвественно, открыт другой документ, гдн нет такого hiden`a - то не будет такой проблемы с методами и ексепшнами.

P.s. забавно:
http://docwiki.embarcadero.com/Libraries/Berlin/en/System.Variants.VarCheckEmpty

тут написано дескать не хочите ексепшн юзайте VarIsEmpty - но при использовании вываливает тоже самое )


vegarulez   (2016-07-28 16:23:00) [10]

Ок пасип- доеду до дома - посомтрю


sniknik   (2016-07-28 16:15:00) [11]

> кода не будет
а, не, все таки откопал исходники
только тут не проверка, а инициализация переменной (там было отличие от того где открыто, в программе или в браузере... в программе вторай авторизация не нужна)
тоже "как есть"

procedure TBriaForm.WebBrowserDocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
 //if Pos('res://', Copy(URL, 1, 6)) > 0 then begin //ресурс (первое выполнение) игнорируем
 //  PostMessage(Handle, WM_AFTERFORMSHOW, 0, 0);   //вместо в FormShow, мало ли, притормозит ие (или вставим туда что-то "тяжолое")
 //  Exit;                                          //выполнение всетаки асинхронное может "перехлестнуться"
 //end;
 try
   if URL = oUrl then
     AddMemInfo('Документ сформирован');

   if not VarIsNullClear(WebBrowser.Document) then
     with WebBrowser.Document as IHTMLDocument2 do
       if not VarIsNullClear(parentWindow) then
         with parentWindow do //с проверкой "наша" страница или нет
            execScript('if (typeof localuser != ''undefined'') {localuser='''+GetUserName+''';}', 'JavaScript');
 except
   on E: Exception do
     SaveToLogP('localuser', ' bria', E, TIMEANDUSERLOG);
 end;
end;


vegarulez   (2016-07-28 16:14:00) [12]

Глобальна. Да я знаю про выполнение из дельфей, но тут надо не из дельфей. Тут отслеживание на изменение переменной. Спасибо, что ответил.
Рою пока инет в поиске нужного решения.


sniknik   (2016-07-28 16:03:00) [13]

> что-то типа javaEval
ExecScript


sniknik   (2016-07-28 16:01:00) [14]

> getElementById  - это поиск по струтуре DOM а у меня переменная в js скрипте которая к DOM не имеет отношения.
читай все, а не части, тем боле "типа", для примера.
> для начала тебе нужно его этим языком/методом (типа getElementById см. комментарий) "втянуть" получить наружу

> Вот в этом и вопрос как проверить V.prov_id на exsists
ответ дан, кода не будет, бо давно уже занимаюсь другим, приведенное "выдернул" из мертвого уже проекта.
+
> у меня просто в js скрипте например
просто не бывает, вот скажи она у тебя глобальная или локальная на время выполнения функции/или тоже локальная "вставка"  в html?
скриптовые языки имеют такую особенность, что большая часть кода может быть не скомпиленной в данный текущий момент.
если глобальная то выполни js скрипт из дельфей (есть среди методов обьекта что-то типа javaEval) верни им переменную и определяй ее... или возвращай тру/фалсе а определяй в скрипте.


vegarulez   (2016-07-28 15:09:00) [15]

у меня просто в js скрипте например
var
prov_id=10;

код успешно работает если подружается файл с скриптом в котором есть такая переменная  - но когда в браузер подгружается любой другой документ в котором такого определения нет она соотвественно не находит и вывваливает эксцепт. Вот в этом и вопрос как проверить V.prov_id на exsists


vegarulez   (2016-07-28 15:02:00) [16]

getElementById  - это поиск по струтуре DOM а у меня переменная в js скрипте которая к DOM не имеет отношения.


sniknik   (2016-07-28 13:54:00) [17]

если
> Method 'prov_id' not supported by automation object
то правильно, нет у webbrowser-a методов внутреннего языка js... для начала тебе нужно его этим языком/методом (типа getElementById см. комментарий) "втянуть" получить наружу, а вот после уже проверка в дельфе.


vegarulez   (2016-07-28 13:28:00) [18]

>> sniknik ©   (28.07.16 13:18) [6]
Тоже самое (((

При загрузке странички где в js нет такой переменной выдает эХцепт (((


sniknik   (2016-07-28 13:18:00) [19]

вот нашел у себя, использовал для того же...
даю как есть с комментарием, написанным чтобы понять зачем... нынче может уже и не будет разницы (IE же тоже обновляют)

function VarIsNullClear(const V: Variant): Boolean;
begin
 result:= VarIsNull(V) or VarIsClear(V); //getElementById/..., в IE 7ке возвращает анансигнед, а если установить "использование 8-го" то в XP также а на win-7 почему-то null
                                         //т.е. на всякий случай будем использовать эту функцию
end;


vegarulez   (2016-07-28 13:15:00) [20]

т.е. эти методы вываливают ошибку, когда пытаются проверить не существующую в документе переменную. Когда оона есть - проверка успешно проходит, но когда загружен файл где переменной с таким именем нет - будет эксцепшин. поэтому и вопрос про проверку на Exsists


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо