如何在Delphi中使用CEF4Delphi访问DOM

欢迎加入全网最大Delphi 技术交流群 682628230

如果您正在使用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;

注意事项

  1. 异步操作:与TWebBrowser不同,使用CEF访问DOM时,您的DOM处理代码不会直接在主线程中执行。因此,在编写代码时需要考虑到这一点,特别是在处理用户界面更新或其他依赖于主线程的操作时。

  2. 确保正确配置:确保已经正确设置了CEF的初始化参数,并且在加载URL之后适时调用DOM访问相关的代码。

通过上述方法,您可以有效地访问由CEF4Delphi加载页面的DOM结构。请根据实际需求调整代码示例中的细节部分。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享