Форум: "Начинающим";
Текущий архив: 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 код и исполняет, то значит можно заменить все " на ' т.е. символы которые будет разбирать браузер в html коде
напримерonclick="javascript:void(alert('Здесь открывается Группа GRP в БД:'+document.getElementById('grppos1').getAttribute('value')))"
← →
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