我试图使用以下代码枚举DOM节点(在XE2下).
我从SO中给出的答案中借用了大部分内容,但出于某种原因,它没有做任何事情.
IOW,ProcessDOM()永远不会被调用.
而且,我在我的智慧结束.
有人能告诉我这里我做错了什么.
提前致谢.
- procedure ProcessNode(ANode: ICefDomNode);
- var
- Node1: ICefDomNode;
- begin
- if Assigned(ANode) then begin
- Node1 := ANode.FirstChild;
- while Assigned(Node1) do begin
- {Do stuff with node}
- ProcessNode(Node1);
- Node1 := Node1.NextSibling;
- end;
- end;
- end;
- procedure ProcessDOM(const ADocument: ICefDomDocument);
- begin
- ProcessNode(ADocument.Body);
- end;
- procedure TMainForm.Chrome1LoadEnd(Sender: TObject; const ABrowser: ICefABrowser; const AFrame: ICefAFrame; AStatus: Integer);
- begin
- if Assigned(AFrame) then AFrame.VisitDomProc(ProcessDOM);
- end;
解决方法
我有同样的问题,我使用dcef3附带的演示guiclient.以下是有效的.
- type TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
- protected
- function OnProcessMessageReceived(const browser: ICefBrowser; sourceProcess: TCefProcessId; const message: ICefProcessMessage): Boolean; override;
- end;
- Chromium1.browser.SendProcessMessage(PID_RENDERER,TCefProcessMessageRef.New('visitdom'));
- function TCustomRenderProcessHandler.OnProcessMessageReceived(browser: ICefBrowser; sourceProcess: TCefProcessId; message: ICefProcessMessage): Boolean;
- begin
- if (message.Name = 'visitdom') then begin
- browser.MainFrame.VisitDomProc(
- procedure(const doc: ICefDomDocument)
- begin
- ProcessNode(Doc.Body);
- end);
- Result := True;
- end;
- end;
- initialization
- CefRenderProcessHandler := TCustomRenderProcessHandler.Create;