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

delphi – 如何在TChromium中检测到点击?

发布时间:2020-12-15 04:13:57 所属栏目:大数据 来源:网络整理
导读:我的Delphi应用程序中有一个TChromium控件,在我显示的页面上,有一个链接可以最小化应用程序.目前,我通过检测地址更改来检测用户何时单击该链接: procedure TForm1.Chromium1AddressChange(Sender: TObject;const browser: ICefBrowser; const frame: ICefFr
我的Delphi应用程序中有一个TChromium控件,在我显示的页面上,有一个链接可以最小化应用程序.目前,我通过检测地址更改来检测用户何时单击该链接:
procedure TForm1.Chromium1AddressChange(Sender: TObject;const browser: ICefBrowser; const frame: ICefFrame; const url: ustring);
begin
if (url = 'file:///data/exiting.exit') then
Form1.Close;

if (url = 'file:///data/minimize.min') then
Application.Minimize;

end;

但是,副作用是浏览器的URL被更改,这是我不想要的.如何在没有URL更改的情况下检测用户何时单击链接?

解决方法

如果我的问题正确,那么您的HTML文档中就会出现如下链接:
<a href="minimize.min">Minimize</a>

并且当您单击此链接时,您希望在应用程序中执行某些操作,但您不希望导航到该链接,因为它只是用于识别操作的虚假链接.好吧,OnAddressChange是一个错误的事件要处理,因为当帧的地址发生变化时,显示处理程序会触发它.因此,从那里取消导航到那个假网站已经太晚了.在DCEF 1中,您可以为OnBeforeBrowse编写处理程序,但即使这样也不是“如此干净”的解决方案,因为您必须解析框架导航到的URL.

正确的方法是保留虚假站点导航并利用DOM事件监听器.然后,您使用什么元素或事件进行交互并不重要.让我们有这个简约的HTML文档:

<html>
  <body>
     <a id="minimize" href="">Minimize</a>
  </body>
</html>

您可以注意到,它导航到无处,但它仍将呈现为链接.它还具有DOM探索识别所需的唯一ID标识符.现在让我们为最小化元素添加click事件的监听器.一旦加载帧就完成此绑定,这通过触发OnLoadEnd事件来报告.在那里,我们将探索DOM树,找到我们的最小化元素并将click事件监听器附加到它:

unit Unit1;

interface

uses
  Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,cefvcl,ceflib;

type
  TForm1 = class(TForm)
    Chromium1: TChromium;
    procedure FormCreate(Sender: TObject);
    procedure Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser;
      const frame: ICefFrame; httpStatusCode: Integer; out Result: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Chromium1.Load('C:File.html');
end;

procedure MinimizeClickEvent(const AEvent: ICefDomEvent);
begin
  ShowMessage('Here the application can be minimized.');
end;

procedure OnExploreDOM(const ADocument: ICefDomDocument);
var
  DOMNode: ICefDomNode;
begin
  // here we attempt to find our "minimize" element
  DOMNode := ADocument.GetElementById('minimize');
  // and if we find it,we attach to its click event our MinimizeClickEvent
  // procedure so whenever the element will be clicked,that procedure will
  // execute
  if Assigned(DOMNode) then
    DOMNode.AddEventListenerProc('click',True,MinimizeClickEvent);
end;

procedure TForm1.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser;
  const frame: ICefFrame; httpStatusCode: Integer; out Result: Boolean);
begin
  if Assigned(frame) then
    frame.VisitDomProc(OnExploreDOM);
end;

end.

通过对代码或HTML文档进行细微更改,您可以收听所选的任何事件或元素,因此您可以使用您网站上的按钮:

<html>
  <body>
     <button id="minimize" type="button">Minimize</button>
  </body>
</html>

当然,您可以根据需要为事件监听器附加尽可能多的元素.

(编辑:李大同)

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

    推荐文章
      热点阅读