Перейти к содержанию
Fire Monkey от А до Я
  • 0

[TWebBrowser] Можно ли получить доступ к элементам разметки страницы HTML?


K0der86

Вопрос

Рекомендуемые сообщения

  • 0

Тоже очень интересует ответ, или направьте пожалуйста, как отловить нажатия кнопки в HTML страничке в TWebBrowser ?

 

Вообще схема следующая есть переменная string в ней HTML код внутри которого javascript, после выполнения скрипта определенные данные мне нужно получить в переменные, пока решил туповато пишу в MySql эти данные с помощью JavaScripta, по возврату в другую вкладку делаю запрос в MySql. В принципе работает, но хотелось бы конечно без бубнов, хотя эти данные все равно запишутся в БД.

Вопрос другой, по завершению всех манипуляций мне нужно нажать на кнопку HTML и переместиться в другую вкладку. 

Ссылка на комментарий
  • 0
  • Администраторы

TWebBrowser не поддерживает возврат результатов при выполнении JavaScript. Но если вам нужно нажать на кнопку или выполнить какие-либо действия без возврата результата в Delphi. То для этого можно использовать JavaScript. Для выполнения JavaScript кода в браузере нужно использовать:

TWebBrowser.EvaluateJavaScript
Ссылка на комментарий
  • 0

 

 

TWebBrowser не поддерживает возврат результатов при выполнении JavaScript. Но если вам нужно нажать на кнопку или выполнить какие-либо действия без возврата результата в Delphi. То для этого можно использовать JavaScript. Для выполнения JavaScript кода в браузере нужно использовать:

TWebBrowser.Gesko 

Это как раз не проблема, моя лично задача сводится к получению данных по какому маркеру кликнули на карте, и соответствующие действия в Delphi onClickMarker. вот если бы разработчики задумались о том что EvaluateJavaScript мог бы стать функцией а не процедурой, и возвращать результат если он есть. Простое решение без добавления эвентов в компаненту. 

Изменено пользователем Syb
Ссылка на комментарий
  • 0

Ну, как промежуточный вариант-сделать мобильный клиент под конкретный сайт:

1.получаешь страницу с помощью get;

2. парсишь ее как нужно (например с помощью .Pos);

3. результаты выводишь в тот же webbrowser (LoadFromStrings);

4.элементы управления выводишь на форму отдельно и обрабатывешь их post запросом;

5. п.3

6. profit

 

А вот как сделать универсальный вариант - может еще кто подскажет :)  

Ссылка на комментарий
  • 0

Может кто знает, в 10.4 под Андроид появилось решение, что бы просто получать содержимое страницы как текст (длинный текст)?

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

Ссылка на комментарий
  • 0
12 часов назад, Станислав Менинник сказал:

Может кто знает, в 10.4 под Андроид появилось решение, что бы просто получать содержимое страницы как текст (длинный текст)?

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

Если я правильно понял, то

..
uses System.Net.URLClient, System.Net.HttpClient, System.Net.HttpClientComponent;
..
procedure Button1.Click(Sender:TObject);
begin
Memo1.lines.LoadFromStream(NetHTTPClient1.Get('http://yoursite.com/').ContentStream);
end;  

 

Ссылка на комментарий
  • 0
В 03.07.2021 в 08:37, PowerOwl сказал:

Если я правильно понял, то

..
uses System.Net.URLClient, System.Net.HttpClient, System.Net.HttpClientComponent;
..
procedure Button1.Click(Sender:TObject);
begin
Memo1.lines.LoadFromStream(NetHTTPClient1.Get('http://yoursite.com/').ContentStream);
end;  

 

Не совсем верно поняли. Я имел ввиду, сам компонент браузер и есть источник данных. Общая схема такая:

- загрузить в браузер текст

- что то редактируем силами JS-редактора

- забираем из браузера текст

 

Столкнулся с еще проблемами:

- вертикального скролбара внутри браузера нет вообще для редактируемого поля JS-редактора (под Андроидом, а под виндой есть)

- JS не работает, если загрузить текст из строки, а не через Navigate. https://quality.embarcadero.com/browse/RSP-34243

Изменено пользователем Станислав Менинник
Ссылка на комментарий
  • 1

wb: TWebBrowser;

получение ответа из браузера в приложение:

procedure TMainForm.wbDidFinishLoad(ASender: TObject);
var i:integer;
begin
    // вызывается несколько раз, поэтому кэшируем
    if lastCommand=wb.URL then exit;
    lastCommand:=wb.URL;
    i:=wb.URL.IndexOf('#action=');
    if i>0 then TActionThread.Create(wb.URL.Substring(i+1));
end;

// на IOS wbDidFinishLoad не срабатывает
procedure TMainForm.wbShouldStartLoadWithRequest(ASender: TObject;
  const URL: string);
{$IF DEFINED(IOS) OR DEFINED(MACOS)}
var i:integer;
{$ENDIF}
begin
{$IF DEFINED(IOS) OR DEFINED(MACOS)}
    if lastCommand=URL then exit;
    lastCommand:=URL;
    i:=URL.IndexOf('#action=');
    if i>0 then TActionThread.Create(URL.Substring(i+1));
{$ENDIF}
end;

запрос из приложения в браузер:

{$IFDEF ANDROID}
          wb.EvaluateJavaScript1(s);

{$ELSE}
          wb.EvaluateJavaScript(s);
{$ENDIF}
 

посылаем ответ из браузера:

document.location.href = '#action=' + name + '&ts=' + (+new Date) + Math.random()

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...