专栏首页jiajia_dengCEF 拦截打开超链接事件

CEF 拦截打开超链接事件

使用 CEF 加载指定页面后,如果你希望控制页面在打开超链接时根据自己预定义的一些行为来操作,比如在自己的 UI 框架中新建一个 Tab 页又或者阻止打开新的页面等。我们就需要通过 CEF 提供的两个接口来实现这个功能了,分别是 OnBeforeBrowser 和 OnBeforePopup,两个接口各有各的用处,下面分别来详细介绍两个接口的作用。

OnBeforePopup

当你在页面中编写了一个 target 属性为 _blank 的超链接标签时,界面中点击这个超链接就会跳转到这个接口中,该接口声明如下:

virtual bool OnBeforePopup(CefRefPtr<CefBrowser> browser,
            CefRefPtr<CefFrame> frame,
            const CefString& target_url,
            const CefString& target_frame_name,
            CefLifeSpanHandler::WindowOpenDisposition target_disposition,
            bool user_gesture,
            const CefPopupFeatures& popupFeatures,
            CefWindowInfo& windowInfo,
            CefRefPtr<CefClient>& client,
            CefBrowserSettings& settings,
            bool* no_javascript_access) = 0;
  • browser 和 frame 分别代表当前浏览器实例和表示了在哪个 frame 触发的这个事件
  • target_url 和 target_frame_name 代表了目标要打开的地址和 frame 名称
  • target_disposition 描述了是从当前页还是从新标签中打开链接
  • user_gesture 如果用户手动点击 a 标签触发这个事件则该属性为 true,否则如果是自动触发的为 false(重要)
  • popupFeatures 包含了一些弹窗的信息,是一个结构体自己可以跟进去看一下
  • windowInfo 窗口的信息
  • client 当前客户端实例
  • settings 弹出窗口的设置信息
  • no_javascript_access 是否允许弹出的窗口使用 JS 脚本,如果为 false 则不允许使用并且与当前页面可能不在一个 render 进程中

当该函数返回 false 的时候,则允许弹出窗口,为 true 的时候就拦截掉不允许弹出了。这里你可以根据自己的需要随便修改。但如果你点击的链接是一个不带 _blank 属性的链接,那么就需要下面的接口才能拦截到了。

OnBeforeBrowser

上面介绍的接口只管弹出窗口的一些信息透传,而这个接口无论你是弹出窗口还是从当前页面加载一个地址,都会经过该接口。该接口的一些参数就不多介绍了,我们关注返回值就好了,当返回值为 false 的时候,页面继续加载。当返回值为 true 的时候,不好意思页面就停止加载了。与上面方法不同的是所有打开新链接的操作都会经过这个接口,OnBeforePopup 也是一样,当你打开一个弹出窗口的链接时,首先进入 OnBeforePopup 再进入 OnBeforeBrowser 函数。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 正确处理安装程序提示 “这个程序可能安装不正确” 问题

    我与梦想有个约会
  • 正确处理安装程序提示 “这个程序可能安装不正确” 问题

    我与梦想有个约会
  • Qt QML qtquickcontrols2.conf 使用系统未安装的自定义字体

    现在很多视觉设计最终给出的字体可能并不是所有系统都安装过的,所以项目中可能需要单独把字体文件打包进去在程序运行的时候加载。Qt QML 有多种方式加载一个自定义...

    我与梦想有个约会
  • 一日一技:4行Python实现抽奖程序

    在有些时候,我们可能会面临随机抽签的临时需求,例如:公司附近有10家饭馆,我们今天去哪家?

    青南
  • SQL 行列转换简单示例

    SQLSERVER 2005 以后提供了新的方式进行行列转换,下面是一个实例供参考: if object_id('tb') is not null drop t...

    用户1177503
  • 前端性能优化之利用 Chrome Dev Tools 进行页面性能分析

    我们经常使用 Chrome Dev Tools 来开发调试,但是很少知道怎么利用它来分析页面性能,这篇文章,我将详细说明怎样利用 Chrome Dev Tool...

    Nealyang
  • 致敬“改革开放四十周年”,VR助力园区第八届全民阅读季成功开幕

    VRPinea
  • React中使用ajax获取数据在移动浏览器中不显示问题

    这个问题困扰了我半个月的时间,今天终于解决了。 在做的一个小项目,页面加载后使用ajax读取本地REST数据,保存在状态中,稍后在form的选择下拉框中显...

    fanzhh
  • 想要算一算Wasserstein距离?这里有一份PyTorch实战

    机器学习中的许多问题都涉及到令两个分布尽可能接近的思想,例如在 GAN 中令生成器分布接近判别器分布就能伪造出逼真的图像。但是 KL 散度等分布的度量方法有很多...

    机器之心
  • 分布式事务方案 - TCC

    TCC是支付宝提出的分布式事务解决方案,是 try、confirm、cancel 的缩写。

    dys

扫码关注云+社区

领取腾讯云代金券