Lee*_*ila 5 delphi delphi-7 chromium-embedded
我的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>
正如您所注意到的,它导航到任何地方,但它仍然会呈现为链接。它还具有idDOM 探索识别所需的自己的唯一标识符。click现在让我们为我们的元素添加事件监听器minimize。该绑定在帧加载后立即完成,这是通过触发OnLoadEnd事件来报告的。在那里我们将探索 DOM 树,找到我们的minimize元素并将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 文档进行少量更改,您可以监听您选择的任何事件或元素,这样您就可以在您的网站上添加一个按钮:
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.
当然,您可以根据需要为任意数量的元素附加事件侦听器。
| 归档时间: | 
 | 
| 查看次数: | 2445 次 | 
| 最近记录: |