我的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的情况下检测用户何时单击链接?
答案 0 :(得分:4)
如果我的问题正确,那么您的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
元素添加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文档发生微小变化,您可以收听您选择的任何事件或元素,这样您就可以获得您网站上的按钮:
<html>
<body>
<button id="minimize" type="button">Minimize</button>
</body>
</html>
当然,您可以根据需要为事件监听器添加多少元素。