CEF拦截js层alert弹窗 OnJSDialog 《转》
一 引言
- 继承,为 ClientHandler 添加一个父类 CefJSDialogHandler
- class ClientHandler : public CefJSDialogHandler
- 声明,在 ClientHandler 声明以下方法:
- public:
- //CefJSDialogHandler
- virtual bool OnJSDialog(CefRefPtr browser,
- const CefString& origin_url,
- const CefString& accept_lang,
- JSDialogType dialog_type,
- const CefString& message_text,
- const CefString& default_prompt_text,
- CefRefPtr callback,
- bool& suppress_message) OVERRIDE;
- // CefClient methods
- // Return the handler for JavaScript dialogs. If no handler is provided the
- // default implementation will be used.
- virtual CefRefPtr GetJSDialogHandler() {
- return this;
- }
- 实现:
- 在client_handler_win.cpp 添加以下方法:
- //tony.guo,重写js alert 框
- bool ClientHandler::OnJSDialog(CefRefPtr browser,
- const CefString& origin_url,
- const CefString& accept_lang,
- JSDialogType dialog_type,
- const CefString& message_text,
- const CefString& default_prompt_text,
- CefRefPtr callback,
- bool& suppress_message) {
- if(dialog_type == JSDIALOGTYPE_ALERT)//普通提示框 询问框
- {
- string strTemp = message_text.ToString();
- CString strMsg = _T("");
- ConvertUtf8ToGBK(strTemp,strMsg);
- CCommonDlg dlg;
- dlg.setShowText(strMsg);
- dlg.setShowIcon();
- dlg.setButtonContent(_T(""),_T("确 定"));
- dlg.setShowTip(_T("提示"));
- dlg.DoModal();
- suppress_message = true;
- return false;
- }
- else if(dialog_type == JSDIALOGTYPE_CONFIRM)//询问框
- {
- string strTemp = message_text.ToString();
- CString strMsg = _T("");
- ConvertUtf8ToGBK(strTemp,strMsg);
- CCommonDlg dlg;
- dlg.setShowText(strMsg);
- dlg.setShowIcon();
- dlg.setButtonContent(_T("确 定"),_T("取 消"));
- dlg.setShowTip(_T("询问"));
- dlg.DoModal();
- if( == dlg.m_nReturnValue)
- {
- callback->Continue(true,"");
- suppress_message = false;
- return true;
- }
- else
- {
- callback->Continue(false,"");
- suppress_message = false;
- return true;
- }
- }
- else if(dialog_type == JSDIALOGTYPE_PROMPT)//输入框,不支持
- {
- CCommonDlg dlg;
- dlg.setShowText(_T("系统不支持prompt形式的提示框"));
- dlg.setShowIcon();
- dlg.setButtonContent(_T(""),_T("确 定"));
- dlg.setShowTip(_T("提示"));
- dlg.DoModal();
- suppress_message = true;
- return false;
- }
- return false;
- }
- 说明:CCommonDlg 是笔者写的一个提示框,读者也可以用MessageBox代替。ConvertUtf8ToGBK 只是一个字符串处理方法,如下:
- void ConvertUtf8ToGBK(string strUtf8,CString &strRet)
- {
- int len = MultiByteToWideChar(CP_UTF8, , (LPCSTR)strUtf8.c_str(), -, NULL,);
- TCHAR * wszGBK = new TCHAR[len+];
- ZeroMemory(wszGBK,len+);
- MultiByteToWideChar(CP_UTF8, , (LPCSTR)strUtf8.c_str(), -, wszGBK, len);
- strRet.Format(_T("%s"),wszGBK);
- delete []wszGBK;
- return;
- }
- 参数解释
- suppress_message参数:
- 如果这个参数被设置为true,并且函数返回值为false,将阻止页面打开JS的弹出窗口。
- 如果这个参数被设置为false,并且函数返回值也是false,页面将会打开这个JS弹出窗口。
- message_text参数:
- 是弹出窗口将要显示的内容
- dialogType参数:
- 是弹出窗口的类型(alert,confirm,Prompt)
- callback参数:
- 当用户点击了弹出窗口的确定按钮,可以用callback.Continue(true, string.Empty);回调确定函数
- 当用户点击了弹出窗口的取消按钮,可以用callback.Continue(false, string.Empty);回调取消函数
- 五 测试
- 在测试页面实现如下代码:
- function AlertTest() {
- //alert('弹框测试');
- if(confirm('您同意吗?'))
- {
- alert('同意');
- }
- }
CEF拦截js层alert弹窗 OnJSDialog 《转》的更多相关文章
- 原生 js 模拟 alert 弹窗
复制头部的 js 代码到你的 js 文件的任何地方,调用Chef.alert方法传入相应的参数即可并没有什么功能,只是一个提示的作用,可能样式比 alert 的弹窗好看点,css是写在js里的,只要你 ...
- js重写alert()弹窗
//重写alertwindow.alert = function(str){ var alertFram = document.getElementById('alertFram'); var shi ...
- JS重写alert,保证弹窗错误的友好性
// ------------------------------------------------------------- // 重写alert,保证弹窗错误的友好性 var j_oldAler ...
- 移动端开发(使用webuploader上传图片,客户端交互,修改alert弹窗等)
之前实习做的一个移动端的页面 需要的功能有图片上传 点击客户端的返回按钮 有提示(即与客户端有交互) 遇到不少的坑 总结一下问题 1.图片上传功能 使用工具 百度的webuploader 暂时遇到的 ...
- 修改js confirm alert 提示框文字的简单实例
修改js confirm alert 提示框文字的简单实例: <!DOCTYPE html> <html> <head lang="en"> & ...
- react.js插件开发,x-dailog弹窗浮层组件
react.js插件开发,x-dailog弹窗浮层组件 我认为,每一个组件都应该有他自带的样式和属性事件回调配置.所以我会给x-dialog默认一套简单的样式,和各种默认的配置项.所有react插件示 ...
- CEF和JS交互
CefClient提供所有浏览器事件处理的接口,重写CefClient类中的方法处理浏览器事件:包括Browser的生命周期,右键菜单,对话框,状态通知显示,下载事件,拖曳事件,焦点事件,键盘事件,离 ...
- Python+Selenium练习篇之20-处理Alert弹窗
本文来介绍如何通过Selenium方法去处理网页Alert弹窗,和处理iframe类似,都是通过switch_to方法.这里还是没有找到合适的alert弹窗网站,我们就自己创建一个吧,前面文章介绍了如 ...
- 基于React.js网页版弹窗|react pc端自定义对话框组件RLayer
基于React.js实现PC桌面端自定义弹窗组件RLayer. 前几天有分享一个Vue网页版弹框组件,今天分享一个最新开发的React PC桌面端自定义对话框组件. RLayer 一款基于react. ...
随机推荐
- 当ABAP遇见普罗米修斯
Jerry每次在工作场合中同Prometheus(普罗米修斯)打交道时,都会"出戏",因为这个单词给我的第一印象,并不是用go语言实现的微服务监控利器,而是名导雷德利·斯科特(Ri ...
- JENKINS安卓打包CI
jenkins构建脚本: [root@localhost tomcat]# cat move.sh #!/bin/bash # author lql release_dir=/data/android ...
- intellij IDEA github clone 指定分支代码
1.问题描述 在实际开发中,我们通常会使用idea克隆一个新项目(clone),通常情况下,我们默认克隆的是master分支,但是如果master分支只是一个空文件夹而已,真正的代码在develop分 ...
- mysql 设置查看字符集
MySQL查看和修改字符集的方法 一.查看字符集 1.查看MYSQL数据库服务器和数据库字符集 方法一:show variables like '%character%';方法二:show var ...
- 宿主机计划任务执行docker相关命令
这个问题拖了好几个月百思不解,或许是由于基础不牢的缘故;百度等等搜索一大篇,还真有人遇到了相似问题 问题:宿主机写好计划任务,是mongodump命令来备份mongo数据库,结果在计划任务里是执行不了 ...
- webapi之owin的oauth2.0密码模式_01概述
一般在webapi接口中,为了防止接口被随意调用,都会验证用户身份. 然而不能每次调用接口都需要用户输入用户名密码来验证,这时就需要授权颁发令牌了,持有令牌就可以访问接口,接口也能验证令牌身份. 简单 ...
- 2013.6.29 - OpenNER第九天
上午看计算机网络,下午做计算机实验.晚上写计算机实验报告,还有OpenStack的实验报告. 写完之后跟师兄讨论了一下OpenNER的事情,觉得OpenNE很像是化学物质,里面很多都可以构成原子团,原 ...
- Navicat Premium 12破解激活11
下载Navicat Premium 12并安装: 百度云下载:Navicat Premium 12注册机 链接:https://pan.baidu.com/s/1UcA5yXjtdfXlBZI-2 ...
- SQL进阶系列之7用SQL进行集合运算
写在前面 集合论是SQL语言的根基,因为这种特性,SQL也被称为面向集合语言 导入篇:集合运算的几个注意事项 注意事项1:SQL能操作具有重复行的集合(multiset.bag),可以通过可选项ALL ...
- el-table 多列显示隐藏造成内容错乱