一 引言

CEF3嵌入后,用JS 弹出Alert框,按钮错位,确定按钮勉强能看到。很难看。为了改善体验,决定重写提示框。
环境:VS2008  VC  MFC.
 
二 原理
参看类 CefJSDialogHandler 的说明。
相关类:CefClient CefJSDialogHandler  ClientHandler 
 
三 准备
使用 cef_binary_3.1453.1255_windows.7z (http://www.magpcss.net/cef_downloads/) 在VS2008 环境建立 MFC 应用程序,调试通过。将加载主页换成自己的测试页面。
 
本文主要是描述重写JSDialog,其他内容不做叙述。
 
四 步骤
 继承,为 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('同意');
}
}

原帖地址:http://blog.sina.com.cn/s/blog_dad2c54101019cm6.html

CEF拦截js层alert弹窗 OnJSDialog 《转》的更多相关文章

  1. 原生 js 模拟 alert 弹窗

    复制头部的 js 代码到你的 js 文件的任何地方,调用Chef.alert方法传入相应的参数即可并没有什么功能,只是一个提示的作用,可能样式比 alert 的弹窗好看点,css是写在js里的,只要你 ...

  2. js重写alert()弹窗

    //重写alertwindow.alert = function(str){ var alertFram = document.getElementById('alertFram'); var shi ...

  3. JS重写alert,保证弹窗错误的友好性

    // ------------------------------------------------------------- // 重写alert,保证弹窗错误的友好性 var j_oldAler ...

  4. 移动端开发(使用webuploader上传图片,客户端交互,修改alert弹窗等)

    之前实习做的一个移动端的页面 需要的功能有图片上传 点击客户端的返回按钮 有提示(即与客户端有交互) 遇到不少的坑 总结一下问题 1.图片上传功能  使用工具 百度的webuploader 暂时遇到的 ...

  5. 修改js confirm alert 提示框文字的简单实例

    修改js confirm alert 提示框文字的简单实例: <!DOCTYPE html> <html> <head lang="en"> & ...

  6. react.js插件开发,x-dailog弹窗浮层组件

    react.js插件开发,x-dailog弹窗浮层组件 我认为,每一个组件都应该有他自带的样式和属性事件回调配置.所以我会给x-dialog默认一套简单的样式,和各种默认的配置项.所有react插件示 ...

  7. CEF和JS交互

    CefClient提供所有浏览器事件处理的接口,重写CefClient类中的方法处理浏览器事件:包括Browser的生命周期,右键菜单,对话框,状态通知显示,下载事件,拖曳事件,焦点事件,键盘事件,离 ...

  8. Python+Selenium练习篇之20-处理Alert弹窗

    本文来介绍如何通过Selenium方法去处理网页Alert弹窗,和处理iframe类似,都是通过switch_to方法.这里还是没有找到合适的alert弹窗网站,我们就自己创建一个吧,前面文章介绍了如 ...

  9. 基于React.js网页版弹窗|react pc端自定义对话框组件RLayer

    基于React.js实现PC桌面端自定义弹窗组件RLayer. 前几天有分享一个Vue网页版弹框组件,今天分享一个最新开发的React PC桌面端自定义对话框组件. RLayer 一款基于react. ...

随机推荐

  1. ABAP-表修改日志存储

    1.设置了变更文档的,可以通过查看标准表CDHDR,CDPOS SE38   --  RSUSR200   ST03N -- 专家模式 2.SE16N维护的数据,可以查看表SE16N_CD_KEY,S ...

  2. css display block 和 inline

    根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为“block”,成为“块级 ...

  3. day 14作业

    作业 现有文件info.txt, 其内容如下: alpha male 18 1000 bravo male 28 2000 charlie female 38 3000 delta female 48 ...

  4. nginx使用过程中遇到的问题及基本使用总结

    问题: 1.出现这个问题nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory) 解 ...

  5. React: 无状态组件生成真实DOM结点

    在上一篇文章中,我们总结并模拟了 JSX 生成真实 DOM 结点的过程,今天接着来介绍一下无状态组件的生成过程. 先以下面一段简单的代码举例: const Greeting = function ({ ...

  6. jQuery知识梳理20190818

    目录 jQuery知识梳理20190818 1. 时间绑定和解绑 2. 区别mouseover与mouseenter 3. 时间委托(委派/代理) 4 . 多库共存 5.window.onload与$ ...

  7. MYSQL使用source命令,导入SQL文件

    命令 source D:/student.sql

  8. AS项目报错 Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details

    1 修改gradle的缓存目录 这个可以通过android studio的设置中找到gradle,配置另一个非中文目录来缓存. File -> Settings -> Build, Exe ...

  9. mysql终止当前正在执行的sql语句

    show processlist;找出你要停止的语句然后找出你要终止的语句的idkill 248

  10. P2602 [ZJOI2010]数字计数(递推)

    P2602 [ZJOI2010]数字计数 思路: 首先考虑含有前导0的情况,可以发现在相同的\(i\)位数中,每个数的出现次数都是相等的.所以我们可以设\(f(i)\)为\(i\)位数每个数的出现次数 ...