解决DCEF3 在 BeforePopup 事件中打开新窗体的问题

解决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技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • 使用css实现水波加载动画效果

    使用 CSS 实现水波加载动画效果是一种很酷炫的效果,可以增加网站的用户体验。以下是实现水波加载动画的完整攻略: 1. 准备工作 首先,在 HTML 文件中创建一个 div 元素,并给它设一个 id 如「wave-bg」,用于装载动画。 <div id="wave-bg"></div> 2. 使用 CSS 绘制水波…

    other 2023年6月25日
    00
  • pycharn破解补丁激活

    PyCharm破解补丁激活 PyCharm是一款功能强大的Python集成开发环境(IDE),它拥有丰富的功能和插件,被广泛用于Python应用程序的开发。但是,由于它是一款商业软件,因此需要付费购买许可证才能使用。对于开发者来说,这可能会是一个不小的负担。因此,许多开发者会寻找破解的方法来使用PyCharm。 在这篇文章中,我们将介绍一种常见的PyChar…

    其他 2023年3月29日
    00
  • 请求的资源在使用中的完美解决方案

    关于请求的资源在使用中的完美解决方案,主要有以下几种解决方案可供选择: 1. 静态资源缓存 静态资源缓存是一种针对静态资源的缓存方案,可以有效地减少请求资源的次数,提升网站访问速度。静态资源包括但不限于CSS、JavaScript、图片等。使用静态资源缓存可以将静态资源保存在浏览器的本地缓存中,当浏览器再次访问网站时,就可以直接从本地缓存读取静态资源,而不必…

    other 2023年6月27日
    00
  • mybatis 返回Map类型key默认为大写问题

    MyBatis 返回 Map 类型 key 默认为大写问题攻略 在 MyBatis 中,当使用 select 语句返回 Map 类型的结果时,默认情况下,Map 的键(key)会被转换为大写形式。这可能会导致一些问题,特别是当数据库中的列名是小写或者混合大小写时。下面是解决这个问题的完整攻略。 解决方法 方法一:使用别名 在 SQL 查询语句中,可以使用别名…

    other 2023年8月19日
    00
  • TCP长连接实践与挑战

    TCP长连接实践与挑战的完整攻略 TCP长连接是指在一次TCP连接中,客户端和服务器之间可以进行多次数据传输,而不是在每次数据传输后就关闭连接。这种连接方式可以减少连接建立和断开的开销,提高网络传输效率。本文将为您提供TCP长连接实与挑战的完整攻略,包括长连接的优缺点、实现方式、心跳机制、断线重连等。 长连接的优缺点 TCP长连接的优点包括: 减少连接建立和…

    other 2023年5月6日
    00
  • java-什么是libjvm.so?何时构建?

    libjvm.so是Java虚拟机(JVM)的核心库文件,它包含了JVM的核心代码和运行时库。在Java应用程序中,libjvm.so库文件通常由Java运行时环境(JRE)或Java开发工具包(JDK)提供。在本文中,我们将详细讲解libjvm.so的作用以及何时构建。 libjvm.so的作用 libjvm.so是Java虚拟机的核心库文件,它包含了JV…

    other 2023年5月9日
    00
  • 删除win10更新后的z盘符(已验证)

    删除Win10更新后的Z盘符(已验证) 最近,一些用户在更新Windows 10后发现,新的系统分配了一个Z盘符,并且无法删除。这是因为在新的更新版本中,Microsoft修改了默认的磁盘分区方式,从而导致了这一问题。在这篇文章中,我们将为您详细介绍如何删除Win10更新后的Z盘符。 步骤一:打开磁盘管理器 首先,我们需要打开Windows磁盘管理器。可以通…

    其他 2023年3月28日
    00
  • webservice测试工具小汇

    以下是使用webservice测试工具小汇的完整攻略,包含两个示例: 步骤1:下载和安装小汇 您可以从小汇的官方网站(https://www.soapui.org/downloads/soapui/)下载小汇。小汇提供了Windows、Mac和Linux版本。 安装小汇后,您可以启动它并开始使用它来测试您的Web服务。 步骤2:创建新的测试项目 在小汇中,您…

    other 2023年5月6日
    00
合作推广
合作推广
分享本页
返回顶部