Delphi 从Chromum Embedded Framework多次调用OnLoadEnd

Delphi 从Chromum Embedded Framework多次调用OnLoadEnd,delphi,delphi-xe2,chromium,onload-event,tchromium,Delphi,Delphi Xe2,Chromium,Onload Event,Tchromium,我尝试使用CEF浏览器钩住OnLoadEnd事件,以便遍历DOM树 出于某种奇怪的原因,我被拜访了两次 procedure TForm1.FormCreate(Sender: TObject); begin FBrowser := TChromium.Create(Self); FBrowser.Parent := TWinControl(Self); FBrowser.OnLoadEnd := BrowserOnLoadEnd; FBrowser.Load('http:

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

出于某种奇怪的原因,我被拜访了两次

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吗?

对于页面上的每个资源,例如图像、外部脚本等,似乎都会使用HttpStatusCode=200调用OnLoadEnd

解决方案是检查正在加载的主机架-frame.IsMain=True

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

请问您是如何得出“BrowserOnLoadEnd”被称为两次的结论的?你是否在“开始”或“结束”上加了一个断点?我没有使用CEF,但我有一种奇怪的感觉,这个“FBrowser.Browser.MainFrame.VisitDom”是“double”事件的生成器。我还看到一个“out Result:Boolean”,您是否应该确保(Result=True)?再一次,我问不太清楚。只是想知道:在设置浏览器的父级时,为什么要将TWinControl派生类TForm1强制转换为TWinControl?这不是一种愚蠢。(例如TWinControl(Self);我确信它被调用了两次,因为我的调试器在BrowserOnLoaded上停止了两次。结果总是False。或者..如果(HttpStatusCode!=0)和Frame.IsMain,则