【问题标题】:OnLoadEnd called multiple times from Chromum Embedded Framework从 Chromium Embedded Framework 多次调用 OnLoadEnd
【发布时间】:2012-03-27 22:19:04
【问题描述】:

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

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

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 会被多次调用吗?

【问题讨论】:

  • 请问您是如何得出“BrowserOnLoadEnd”被调用两次的结论的?你在“开始”上放了一个断点还是?没用过CEF,但是有一种奇怪的感觉,这个“FBrowser.Browser.MainFrame.VisitDom”是“double”事件的生成器。
  • P.S.我还看到一个“输出结果:布尔值”,您不应该确保(结果 = True)吗?再次,我问不确定..
  • 只是想知道:为什么在设置浏览器的父级时将 TWinControl 派生类 TForm1 强制转换为 TWinControl?那不是尼斯。 (例如 TWinControl(Self);
  • 我确信它被调用了两次,因为我的调试器在 BrowserOnLoadEnd 上停止了两次。结果总是假的。

标签: delphi delphi-xe2 chromium onload-event tchromium


【解决方案1】:

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

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

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

【讨论】:

  • 或者.. if (HttpStatusCode != 0) and Frame.IsMain then
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 2012-12-31
  • 2014-07-26
  • 2014-08-15
  • 2021-01-25
相关资源
最近更新 更多