Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Оптимизация работы с DOM в Chromium Embedded Framework: решение проблемы двойного вызова события `OnLoadEnd`

Delphi , Компоненты и Классы , Свойства и События

Оптимизация работы с DOM в Chromium Embedded Framework: решение проблемы двойного вызова события OnLoadEnd

Введение

В данной статье мы рассмотрим проблему, возникающую при работе с Chromium Embedded Framework (CEF), когда событие OnLoadEnd вызывается дважды. Это может привести к непредвиденному поведению при попытке обойти дерево DOM. Мы рассмотрим контекст проблемы, предложим решение и обсудим альтернативные подходы.

Описание проблемы

При использовании CEF для отображения веб-страниц и попытке подключения к событию OnLoadEnd для обхода DOM, пользователи могут столкнуться с ситуацией, когда обработчик VisitDom вызывается дважды. Это может быть вызвано различными ассетами страницы, такими как изображения и внешние скрипты, каждый из которых может инициировать отдельный вызов события OnLoadEnd.

Пример кода

procedure TForm1.FormCreate(Sender: TObject);
begin
   FBrowser := TChromium.Create(Self);
   FBrowser.Parent := TWinControl(Self);
   FBrowser.OnLoadEnd := BrowserOnLoadEnd;
   FBrowser.Load('http://google.com');
end;

procedure VisitDom(const Document: ICefDomDocument);
begin
   ShowMessage(Document.Document.Name);
end;

procedure TForm1.BrowserOnLoadEnd(Sender: TObject;
  const Browser: ICefBrowser; const Frame: ICefFrame; HttpStatusCode: Integer;
  out Result: Boolean);
var
   Visitor: TCefFastDomVisitor;
begin
   if (HttpStatusCode = 200) and Frame.IsMain then
   begin
      Visitor := TCefFastDomVisitor.Create(VisitDom);
      FBrowser.Browser.MainFrame.VisitDom(Visitor);
   end;
   Result := True;
end;

Подтвержденное решение

Проблема двойного вызова события OnLoadEnd может быть решена путем проверки, что основная рамка (main frame) загружена, то есть Frame.IsMain = True. Это позволит убедиться, что обход DOM выполняется только один раз, даже если страница содержит несколько ресурсов, вызывающих событие загрузки.

Альтернативные подходы

В комментариях было предложено также проверить, что код возврата HttpStatusCode не равен нулю перед выполнением обхода DOM. Это может быть полезно, если нужно исключить обработку ошибок загрузки.

Заключение

В данной статье мы рассмотрели проблему двойного вызова события OnLoadEnd в CEF и предложили проверку на основную рамку как эффективное решение. Мы также обсудили альтернативные подходы, которые могут быть использованы для улучшения надежности и производительности работы с DOM.

Примечание

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

Создано по материалам из источника по ссылке.

Проблема двойного вызова события `OnLoadEnd` при работе с DOM в Chromium Embedded Framework и способы её решения.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Свойства и События ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 02:05:40/0.0032079219818115/0