delphi - OnLoadEnd 从 Chromium 嵌入式框架调用多次

标签 delphi delphi-xe2 chromium onload-event tchromium

使用 CEF 浏览器,我尝试 Hook OnLoadEnd 事件以遍历 DOM 树。

出于某种奇怪的原因,我调用了 VisitDom 2 次。

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 then
  begin
    Visitor := TCefFastDomVisitor.Create(VisitDom);
    FBrowser.Browser.MainFrame.VisitDom(Visitor);
  end;
end;

知道为什么 OnLoadEnd 被多次调用吗?

最佳答案

对于页面拥有的每个 Assets ,例如图像、外部脚本等,似乎使用 HttpStatusCode = 200 调用 OnLoadEnd。

解决方案是检查正在加载的主框架 - Frame.IsMain = True。

if (HttpStatusCode = 200) and Frame.IsMain then
begin
  Visitor := TCefFastDomVisitor.Create(VisitDom);
  FBrowser.Browser.MainFrame.VisitDom(Visitor);
end;

关于delphi - OnLoadEnd 从 Chromium 嵌入式框架调用多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9898529/

相关文章:

在 C 和 Delphi 中将字节数组转换为 2 unsigned long

google-chrome - 在 wss 安全模式下运行时,chrome 中的 websocket 性能明显较差

为 Android 构建 Chromium 时缺少/找不到 android_gyp

css - DIV 背景图像在首次加载时不显示。仅当首次使用 Chrome 在 FB 上加载应用程序时才会发生

Delphi : How to read image from ".res file", 不是嵌入资源

delphi - 如何下载消息、存储它并在不同的文件夹中重新创建它?

delphi - 如何解决命名和范围冲突?

delphi - 在某些组件上更改鼠标光标而不影响其他光标设置代码

delphi - 如何在一个区域中放置文本?

delphi - 如何在 Firemonkey stringgrid 单元格中使用不同的字体样式和图标