Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2018.09.02;
Скачать: CL | DM;

Вниз

[TWebbrowser+JS] Как проверить переменную js?   Найти похожие ветки 

 
vegarulez ©   (2016-07-28 11:44) [0]

Всем привет!
Подскажите как правильно проверять наличие переменной в загруженном документе в 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;


 
iop ©   (2016-07-28 12:10) [1]

вариземпти + варизнул + <> nil


 
vegarulez ©   (2016-07-28 12:30) [2]

Ок, попробую пасип.


 
vegarulez ©   (2016-07-28 13:03) [3]

Не совсем понятно что с nil сравнивать?
V.prov_id<>nil - выдает инкомпатибл тайпс ещё на этапе компиляхи

Остальные методы при обработке в документе, в котором в js нет такой переменной (prov_id) также выдает ошибку на эксепшене.


 
vegarulez ©   (2016-07-28 13:06) [4]

Webbrowser1CommandStateChange
Method "prov_id" not supported by automation object
0


 
vegarulez ©   (2016-07-28 13:15) [5]

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


 
sniknik ©   (2016-07-28 13:18) [6]

вот нашел у себя, использовал для того же...
даю как есть с комментарием, написанным чтобы понять зачем... нынче может уже и не будет разницы (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:28) [7]

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

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


 
sniknik ©   (2016-07-28 13:54) [8]

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


 
vegarulez ©   (2016-07-28 15:02) [9]

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


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

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

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


 
sniknik ©   (2016-07-28 16:01) [11]

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

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


 
sniknik ©   (2016-07-28 16:03) [12]

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


 
vegarulez ©   (2016-07-28 16:14) [13]

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


 
sniknik ©   (2016-07-28 16:15) [14]

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

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:23) [15]

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


 
vegarulez ©   (2016-07-28 21:32) [16]

>>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 21:33) [17]

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


 
iop ©   (2016-07-28 21:46) [18]

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



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


 
vegarulez ©   (2016-07-29 07:43) [19]

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


 
sniknik ©   (2016-07-29 10:43) [20]

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


 
vegarulez ©   (2016-07-29 19:20) [21]

Столкнулся ещё с одной проблеммой - переменной в коде ниже она выделена жирным.
Из-за множества скобков (код внизу) - 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;


 
vegarulez ©   (2016-07-29 19:45) [22]

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

elem.innerHTML = """+s+""";

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


 
vegarulez ©   (2016-08-02 22:28) [23]

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


 
vegarulez ©   (2016-08-02 22:32) [24]

Вообщем нашел ответ как это сделать - т.к. браузер считывает 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 ; )))"



Страницы: 1 вся ветка

Текущий архив: 2018.09.02;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.004 c
2-1468753424
Антонов Саша
2016-07-17 14:03
2018.09.02
Delphi 10 Seattle, преобразование типов


2-1469714607
SergP
2016-07-28 17:03
2018.09.02
Передача функции динамического массива по значению


2-1469695491
vegarulez
2016-07-28 11:44
2018.09.02
[TWebbrowser+JS] Как проверить переменную js?


15-1472570154
sniknik
2016-08-30 18:15
2018.09.02
Чудо? :)


2-1470210735
p
2016-08-03 10:52
2018.09.02
Как получить выравнивание текста колонки