如果我没看错你的问题,你的 HTML 文档中有这样的链接:
<a href="minimize.min">Minimize</a>
并且您想在单击此链接时在您的应用程序中执行某些操作,但您不想导航到该链接,因为它只是一个仅用于识别操作的假链接。好吧,OnAddressChange 是一个错误的事件,因为当帧的地址发生变化时,它被显示处理程序触发。因此,从那里取消导航到那个假网站已经太迟了。在 DCEF 1 中,您可以为 OnBeforeBrowse 编写处理程序,但即使这样也不是“如此干净”的解决方案,因为您必须解析框架导航到的 URL。
正确的方法是离开虚假站点导航并使用 DOM 事件侦听器。然后,您使用什么元素或事件进行交互并不重要。让我们拥有这个简约的 HTML 文档:
<html>
<body>
<a id="minimize" href="">Minimize</a>
</body>
</html>
如您所见,它无法导航到任何地方,但仍会呈现为链接。它还有自己独特的id 标识符,用于 DOM 探索识别。现在让我们为minimize 元素添加click 事件的侦听器。此绑定在框架加载后立即完成,通过触发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>
当然,您可以为任意数量的元素附加事件侦听器。