解决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日

相关文章

  • Java利用TCP协议实现客户端与服务器通信(附通信源码)

    Java利用TCP协议实现客户端与服务器通信攻略 前言 在Java中实现TCP协议的客户端和服务器之间的通信,可以借助于Java中提供的Socket和ServerSocket类。其中,Socket类实现客户端的创建,ServerSocket类实现服务器的创建。本篇文档将详细讲解如何利用Java实现TCP协议的客户端与服务器之间的通信。 步骤 Java实现TC…

    other 2023年6月27日
    00
  • Go项目的目录结构详解

    Go项目的目录结构详解 在Go语言中,一个项目的目录结构对于代码的组织和维护非常重要。一个良好的目录结构可以提高代码的可读性和可维护性。下面是一个常见的Go项目的目录结构示例: myproject/ ├── cmd/ │ └── myapp/ │ └── main.go ├── pkg/ │ └── mypackage/ │ └── mypackage.go…

    other 2023年9月7日
    00
  • ubuntu16.04下vim的安装与配置

    下面是“Ubuntu 16.04下Vim的安装与配置的完整攻略”,包括安装、配置和两个示例说明。 安装 在 Ubuntu 16.04 中,可以使用以下命令安装 Vim: sudo apt-get update sudo apt-get install vim 配置 在 Ubuntu 16.04 中,可以按照以下步骤配置 Vim: 打开终端并输入以下命令: v…

    other 2023年5月5日
    00
  • im-即时通讯技术概述

    以下是关于“IM-即时通讯技术概述”的完整攻略,包括基本概念、技术架构、应用场景和两个示例。 基本概念 IM(Instant Messaging)即时通讯技术是一种实时通讯技术,可以让用户在互联网上进行实时的文字、语音、视频等多种形式的通讯。IM技术已经成为了现代社交、商务、教育等领域中不可或缺的一部分。 技术架构 IM技术的技术架构通常包括以下几个部分: …

    other 2023年5月7日
    00
  • servlet生命周期_动力节点Java学院整理

    下面是详细的讲解“servlet生命周期”的攻略,包含了流程和两个示例说明。 什么是servlet生命周期 servlet生命周期指的是servlet容器创建一个servlet实例、处理客户请求、响应客户请求、销毁servlet实例的一系列过程。servlet生命周期由servlet容器来管理,servlet容器可以实现servlet生命周期的各个环节。 s…

    other 2023年6月27日
    00
  • 360安全卫士怎么给电脑软件设置优先级?

    360安全卫士如何给电脑软件设置优先级 什么是软件优先级 软件优先级是指在多任务操作系统中,设置某个软件程序的运行优先级。较高的运行优先级可以使软件在资源竞争中获得更多的系统资源,从而提高其运行效率。 步骤 下面是使用360安全卫士给电脑软件设置优先级的步骤: 打开360安全卫士软件。在桌面或任务栏上找到并双击打开360安全卫士。 选择优化加速功能。在360…

    other 2023年6月28日
    00
  • vue 组件中使用 transition 和 transition-group实现过渡动画

    使用transition实现过渡动画 步骤1:导入Vue和Transition组件 在组件的script标签中,导入Vue和Transition组件。 <script> import { Transition } from ‘vue’; export default { name: ‘MyComponent’, components: { Tra…

    other 2023年6月28日
    00
  • Go gRPC服务端流式RPC教程示例

    Go gRPC是一个高效的RPC框架,支持服务端和客户端流式RPC。在本教程中,我们将演示如何使用Go gRPC实现服务端流式RPC。 1. 安装Go和gRPC 首先,我们需要安装Go和gRPC。你需要按照以下步骤执行: 下载并安装Go,可以从官网 https://golang.org/ 下载安装包进行安装 下载并安装gRPC的protobuf代码生成器。可…

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