delphi – 枚举TChromium中的DOM节点

前端之家收集整理的这篇文章主要介绍了delphi – 枚举TChromium中的DOM节点前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使用以下代码枚举DOM节点(在XE2下).

我从SO中给出的答案中借用了大部分内容,但出于某种原因,它没有做任何事情.

IOW,ProcessDOM()永远不会被调用.

而且,我在我的智慧结束.

有人能告诉我这里我做错了什么.

提前致谢.

  1. procedure ProcessNode(ANode: ICefDomNode);
  2. var
  3. Node1: ICefDomNode;
  4. begin
  5. if Assigned(ANode) then begin
  6. Node1 := ANode.FirstChild;
  7. while Assigned(Node1) do begin
  8. {Do stuff with node}
  9. ProcessNode(Node1);
  10. Node1 := Node1.NextSibling;
  11. end;
  12. end;
  13. end;
  14.  
  15. procedure ProcessDOM(const ADocument: ICefDomDocument);
  16. begin
  17. ProcessNode(ADocument.Body);
  18. end;
  19.  
  20. procedure TMainForm.Chrome1LoadEnd(Sender: TObject; const ABrowser: ICefABrowser; const AFrame: ICefAFrame; AStatus: Integer);
  21. begin
  22. if Assigned(AFrame) then AFrame.VisitDomProc(ProcessDOM);
  23. end;

解决方法

我有同样的问题,我使用dcef3附带的演示guiclient.以下是有效的.
  1. type TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
  2. protected
  3. function OnProcessMessageReceived(const browser: ICefBrowser; sourceProcess: TCefProcessId; const message: ICefProcessMessage): Boolean; override;
  4. end;
  5.  
  6. Chromium1.browser.SendProcessMessage(PID_RENDERER,TCefProcessMessageRef.New('visitdom'));
  7.  
  8. function TCustomRenderProcessHandler.OnProcessMessageReceived(browser: ICefBrowser; sourceProcess: TCefProcessId; message: ICefProcessMessage): Boolean;
  9. begin
  10. if (message.Name = 'visitdom') then begin
  11. browser.MainFrame.VisitDomProc(
  12. procedure(const doc: ICefDomDocument)
  13. begin
  14. ProcessNode(Doc.Body);
  15. end);
  16. Result := True;
  17. end;
  18. end;
  19.  
  20. initialization
  21. CefRenderProcessHandler := TCustomRenderProcessHandler.Create;

猜你在找的Delphi相关文章