解决DCEF3 在 BeforePopup 事件中打开新窗体的问题
最近在使用 DCEF3 插件开发浏览器时,遇到了一个问题。在编写 BeforePopup 事件的处理代码时,想要打开一个新窗体,但发现并没有生效。经过一番调查和实验,终于找到了解决方案。
问题描述
在 DCEF3 中,BeforePopup 事件可以用于拦截新窗口的打开,并根据需要进行一些处理。例如,可以通过修改 URL 来实现 URL 重定向,也可以通过记录日志来进行统计分析。
我们的代码中需要在 BeforePopup 事件中打开一个新窗体,代码如下:
procedure TForm1.Chromium1BeforePopup(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const targetUrl, targetFrameName: ustring; const popupFeatures: ICefPopupFeatures;
var windowInfo: TCefWindowInfo; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; out Result: Boolean);
begin
Result := True; // 拦截新窗口打开
// 打开新窗体
TForm2.Create(Self).Show;
end;
然而,发现窗口并没有被正确打开。在 Chrome 浏览器里可以正确打开,但在 DCEF3 中无法工作,似乎被拦截了。经过实验与调查,我们找到了问题的原因和解决方法。
问题原因
在 Chromium 中,打开新窗口有两种方式: 一种是使用 JavaScript 的 window.open()
函数,另一种是通过链接的 target='_blank'
属性来实现。在 DCEF3 中,前者能够被正确处理,但后者会被拦截。在我们的代码中,使用的是后者。
经过分析,我们发现 DCEF3 的代码中使用了 PopupFeatures.NoJavascriptAccess
属性来判断链接是否可以打开新窗口。当该属性被设置为 True 时,链接将被拦截。而默认情况下,该属性的值是 True。
解决方法
要解决这个问题,我们需要修改 PopupFeatures.NoJavascriptAccess
属性的值。可以在 BeforePopup 事件处理代码中添加以下一行代码:
popupFeatures.NoJavascriptAccess := False;
这样就可以正确打开新窗口了。完整的代码如下:
procedure TForm1.Chromium1BeforePopup(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const targetUrl, targetFrameName: ustring; const popupFeatures: ICefPopupFeatures;
var windowInfo: TCefWindowInfo; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; out Result: Boolean);
begin
Result := True; // 拦截新窗口打开
popupFeatures.NoJavascriptAccess := False; // 允许 JavaScript 打开新窗口
// 打开新窗体
TForm2.Create(Self).Show;
end;
总结
在 DCEF3 中,通过修改 BeforePopup 事件的处理代码,可以正确打开链接的 target='_blank'
的超链接。这个问题的解决方法是将 PopupFeatures.NoJavascriptAccess
属性的值设置为 False。希望本文能对大家的开发工作有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决DCEF3 在 BeforePopup 事件中打开新窗体的问题 - Python技术站