使用 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/