如果您正在使用CEF4Delphi项目,并希望加载页面后能够访问其DOM,以下是实现该目标的方法:
使用最新版本的CEF4Delphi
确保您下载并使用了CEF4Delphi的最新版本,因为早期版本可能缺少必要的DOM访问功能。新版本中包含了一个名为DOMVisitor
的演示示例,它展示了如何访问网页的DOM。
-
参考
uDOMVisitor.pas
文件中的DOMVisitor_OnDocAvailable
函数:这个函数展示了如何利用自定义的渲染进程处理器(RenderProcessHandler)和TCefFastDomVisitor
类来访问DOM。 -
运行
DOMVisitor
演示:加载网页后,右键点击页面并选择“Visit DOM”选项,以查看具体操作。
示例代码片段
为了更清晰地展示如何通过发送消息给Chromium的渲染进程来处理DOM,以下是一个基于CEF3的例子,虽然不完全相同,但原理相似,可以作为参考:
procedure TMainForm.actDomExecute(Sender: TObject);
begin
// 发送消息给渲染进程以开始DOM访问
crm.browser.SendProcessMessage(PID_RENDERER, TCefProcessMessageRef.New('visitdom'));
end;
// 自定义渲染进程处理器
TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
protected
function OnProcessMessageReceived(const browser: ICefBrowser; sourceProcess: TCefProcessId;
const message: ICefProcessMessage): Boolean; override;
end;
function TCustomRenderProcessHandler.OnProcessMessageReceived(
const browser: ICefBrowser; sourceProcess: TCefProcessId;
const message: ICefProcessMessage): Boolean;
begin
if (message.Name = 'visitdom') then
begin
// 访问DOM
browser.MainFrame.VisitDomProc(
procedure(const doc: ICefDomDocument)
begin
// 添加事件监听器等操作
doc.Body.AddEventListenerProc('mouseover', True,
procedure (const event: ICefDomEvent)
var
msg: ICefProcessMessage;
begin
msg := TCefProcessMessageRef.New('mouseover');
msg.ArgumentList.SetString(0, getpath(event.Target));
browser.SendProcessMessage(PID_BROWSER, msg);
end);
end);
Result := True;
end else
Result := False;
end;
注意事项
-
异步操作:与TWebBrowser不同,使用CEF访问DOM时,您的DOM处理代码不会直接在主线程中执行。因此,在编写代码时需要考虑到这一点,特别是在处理用户界面更新或其他依赖于主线程的操作时。
-
确保正确配置:确保已经正确设置了CEF的初始化参数,并且在加载URL之后适时调用DOM访问相关的代码。
通过上述方法,您可以有效地访问由CEF4Delphi加载页面的DOM结构。请根据实际需求调整代码示例中的细节部分。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END