Когда вы работаете с веб-страницами, созданными с использованием JavaScript, иногда возникает необходимость доступа к переменным JavaScript из внешнего кода, например, из приложения на Delphi. В данной статье мы рассмотрим, как можно читать и записывать переменные JavaScript, используя компонент TWebBrowser в среде Delphi.
Проблема
Представим, что у вас есть веб-страница с переменными JavaScript:
<script>
var _ANYINT = 0;
var _ANYOBJ = 0;
</script>
И вы хотите прочитать значение переменной _ANYINT из вашего Delphi-приложения.
Решение
Для чтения и записи переменных JavaScript можно использовать интерфейс IHTMLWindow, который предоставляет функцию execScript. Однако execScript не позволяет возвращать результаты выполнения. Поэтому для доступа к данным JavaScript необходимо в вашем JavaScript-коде создать функцию, которая будет записывать требуемые данные в скрытое поле на странице, и затем из Delphi читать это поле через компонент TWebBrowser.
Пример кода на Delphi для чтения данных из скрытого поля:
function Read_ANYINT: Integer;
var
v: OleVariant;
begin
v := Browser.Document;
Result := v.parentWindow._ANYINT;
end;
Если ваша страница загружена через протокол file:///, такой подход не сработает. В этом случае сначала необходимо перейти в режим 'about:blank' и затем загрузить HTML-документ из строки, используя процедуру LoadHTML.
Альтернативный способ
Существует альтернативный способ доступа к глобально определенным переменным JavaScript, заключающийся в запросе у IHTMLWindow2 значений этих переменных. Например, для чтения значения переменной myVariable:
uses
MSHTML, ActiveX;
var
Window: IHTMLWindow2;
DispatchIdOfProperty: Integer;
MyPropertyValue: OleVariant;
Temp: TExcepInfo;
Res: Integer;
Params: TDispParams;
begin
Window := (WebBrowser1.ControlInterface.Document as IHTMLDocument2).parentWindow;
if (Window as IDispatchEx).GetDispID('myVariable', fdexNameCaseSensitive, DispatchIdOfProperty) = S_OK then
begin
ZeroMemory(@Params, SizeOf(Params));
Res := (Window as IDispatchEx).InvokeEx(DispatchIdOfProperty, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, @Params, MyPropertyValue, Temp, nil);
if Res = S_OK then
ShowMessage(MyPropertyValue);
end;
end;
Запись переменной аналогична чтению, но используется DISPATCH_PROPERTYPUT в вызове InvokeEx.
Работа с массивами
Для доступа к массивам JavaScript можно использовать обертку, которая позволяет работать с ними как с объектами COM. Пример такой обертки:
var
v: OleVariant;
i: Integer;
lArray: TJSArrayWrapper;
begin
v := Browser.Document.parentWindow;
lArray := TJScriptArray.Create(v.myArray);
try
for i := 0 to lArray.Count - 1 do
begin
ShowMessage(lArray[i]);
end;
finally
FreeAndNil(lArray);
end;
end;
Заключение
В данной статье мы рассмотрели различные способы чтения и записи переменных JavaScript из приложений на Delphi, используя компонент TWebBrowser. Это может быть полезно в различных сценариях, когда необходимо взаимодействие между веб-страницами и внешним кодом.
Работа с переменными JavaScript на веб-странице, включая их чтение и запись, а также взаимодействие с этими переменными из внешних приложений, например, из среды разработки Delphi, используя компонент `TWebBrowser`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.