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

OnBeforePopup

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

  1. virtual bool OnBeforePopup(CefRefPtr<CefBrowser> browser,
  2. CefRefPtr<CefFrame> frame,
  3. const CefString& target_url,
  4. const CefString& target_frame_name,
  5. CefLifeSpanHandler::WindowOpenDisposition target_disposition,
  6. bool user_gesture,
  7. const CefPopupFeatures& popupFeatures,
  8. CefWindowInfo& windowInfo,
  9. CefRefPtr<CefClient>& client,
  10. CefBrowserSettings& settings,
  11. 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 函数。

CEF 拦截打开超链接事件的更多相关文章

  1. JS、html打开超链接的几种形式

    1.直接使用input在原有的标签页中直接打开一个页面,将原有标签页覆盖 在按钮中直接打开一个连接,这里不需要用到js的代码,根据HTML中的onclick属性 <input type=&quo ...

  2. 使用NHibernate(4)--拦截器和事件

    如果想在一个事务的开始.执行中.完成后等过程中执行一些自己的逻辑(比如记录日志.查看sql),拦截器(Interceptors)和事件(Event)就可以发挥作用了.两者所能完成的功能差不多. 1,拦 ...

  3. NHibernate官方文档中文版--拦截器和事件(Interceptors and events)

    对于应用程序来说,能够对NHibernate内部发生的事件做出响应式很有用的.这能够有助于实现一些类的功能或者扩展NHibernate的功能. 拦截器 IInterceptor接口提供了应用程序ses ...

  4. iOS UIWebView 拦截点击事件(双击缩放)

    在平时的开发中,要使用到webview,但类似微信的webview在数据没有加载完成的时候 双击屏幕,webview不会缩放,其实实现这个功能很简单 代码是用swift写的 class YYSimpl ...

  5. javacript实现不被浏览器拦截打开新窗口

    情景: 1.用户发送数据到服务器 2.服务器根据用户的数据生成文档 3.服务器把所生成的文档的下载地址提供给用户 4.用户使用的浏览器自动根据下载地址下载文件 实现: 网上搜索查找了下实现方式,就我查 ...

  6. 笔记:Hibernate 拦截器和事件

    Hibernate 在执行持久化的过程中,应用程序通常无法参与其中,通过事件框架,Hibernate 允许应用程序能响应特定的内部事件,从而允许实现某些通用的功能,或者对 Hibernate 进行扩展 ...

  7. Unity3d之UGUI- Image拦截Button响应事件

    在编辑UI的时候Image放在Button前面就会挡掉button的响应 这种情况只需要为Image添加CanvasGroup組件 按照这个属性配置就不会挡掉后面的事件了

  8. 记录C#-WPF打开/关闭>>事件执行顺序

    打开执行顺序                                          关闭执行顺序

  9. CEF拦截js层alert弹窗 OnJSDialog 《转》

    一 引言 CEF3嵌入后,用JS 弹出Alert框,按钮错位,确定按钮勉强能看到.很难看.为了改善体验,决定重写提示框. 环境:VS2008  VC  MFC.   二 原理 参看类 CefJSDia ...

随机推荐

  1. [LeetCode] 4. Median of Two Sorted Arrays 两个有序数组的中位数

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  2. django实战(二)--带多字段模糊查询的分页(也是不容易)

    上节我们实现了分页功能,这节我们要实现对模糊查询后的结果进行分页.(引入了bootstrap框架) urls.py from django.urls import path from . import ...

  3. I/O多路复用-EPOLL探索

    什么是I/O多路复用 I/O多路复用就是通过一种机制,可以监视多个描述符,一旦某个IO能够读写,通知程序进行相应的读写操作. I/O多路复用的场合 1.当客户处理多个描述字时(通常是交互式输入和网络套 ...

  4. jenkins+sonarqube进行代码质量检测

    JavaNeverGiveUp教程篇 用jenkins+sonarqube去检查代码是非常方便的,它能检查出代码中可能存在的一些问题,比如io流未关闭.空指针异常.死循环.代码不规范等问题. 1. 搭 ...

  5. HandlerInterceptorAdapter

    handler,是指controller的@Controller注解下的整个方法名

  6. 管理ceph缓存池

    目录 缓存池简介 缓存池原理 缓存池的工作模式 配置缓存池 1. 创建一个缓存池 2. 设置缓存层 3. 缓存层相关参数说明 4. 测试缓存池 删除缓存池 1. 删除read-only缓存池 2. 删 ...

  7. Obloq模块:基于ESP8266的物联网模块

    OBLOQ 物联网模块 OBLOQ模块是DFRobot公司开发的一款基于ESP8266芯片的物联网通信模块.模块使用串口(TTL UART)和Arduino(或者其他单片机)通信,支持MQTT,HTT ...

  8. 发送邮件报错javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed

    关于使用javaMail发送邮件报错:javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multip ...

  9. SublimeText3安装Markdown插件

    由于Webstrom对md文件的预览效果并不理想(与实际网页编译效果差别较大),所以我又改用Sublime进行本地编辑,下面介绍一下怎么搭建环境. 插件安装 整套环境我们就需要两个插件:Markdow ...

  10. React学习之路之创建项目

    React 开发环境准备 IDE工具 visual studio code 开发环境 开发环境需要安装nodejs和npm,nodejs工具包含了npm. nodejs下载官网:https://nod ...