Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2018.09.02;
Скачать: [xml.tar.bz2];

Вниз

[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;
Скачать: [xml.tar.bz2];

Наверх





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


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


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


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


2-1468753424
Антонов Саша
2016-07-17 14:03
2018.09.02
Delphi 10 Seattle, преобразование типов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский