加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – OnLoadEnd从Chromum Embedded Framework多次调用

发布时间:2020-12-15 09:17:56 所属栏目:大数据 来源:网络整理
导读:使用CEF浏览器我尝试挂钩OnLoadEnd事件以遍历DOM树. 由于一些奇怪的原因,我得到了两次VisitDom. procedure TForm1.FormCreate(Sender: TObject);begin FBrowser := TChromium.Create(Self); FBrowser.Parent := TWinControl(Self); FBrowser.OnLoadEnd := Br
使用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?

解决方法

似乎OnLoadEnd是使用HttpStatusCode = 200为页面所拥有的每个资产调用的,例如:图像,外部脚本等.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读