OnLoadEnd вызывается несколько раз из Chromum Embedded Framework - PullRequest
4 голосов
/ 28 марта 2012

Используя CEF Browser, я пытаюсь подключиться к событию OnLoadEnd для обхода дерева DOM.

По какой-то странной причине я вызываю визитку 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 вызывается несколько раз?

1 Ответ

5 голосов
/ 28 марта 2012

Похоже, что OnLoadEnd вызывается с HttpStatusCode = 200 для каждого актива страницы, такого как: изображения, внешние скрипты и т. Д.

Решение заключается в проверке загрузки основного кадра - Frame.IsMain = True.

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