一 引言

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,其他内容不做叙述。
 
四 步骤
  1. 继承,为 ClientHandler 添加一个父类 CefJSDialogHandler
  2. class ClientHandler : public CefJSDialogHandler
  3.  
  4. 声明,在 ClientHandler 声明以下方法:
  5. public:
  6.  
  7. //CefJSDialogHandler
  8. virtual bool OnJSDialog(CefRefPtr browser,
  9. const CefString& origin_url,
  10. const CefString& accept_lang,
  11. JSDialogType dialog_type,
  12. const CefString& message_text,
  13. const CefString& default_prompt_text,
  14. CefRefPtr callback,
  15. bool& suppress_message) OVERRIDE;
  16.  
  17. // CefClient methods
  18. // Return the handler for JavaScript dialogs. If no handler is provided the
  19. // default implementation will be used.
  20.  
  21. virtual CefRefPtr GetJSDialogHandler() {
  22. return this;
  23. }
  24.  
  25. 实现:
  26. client_handler_win.cpp 添加以下方法:
  27.  
  28. //tony.guo,重写js alert 框
  29. bool ClientHandler::OnJSDialog(CefRefPtr browser,
  30. const CefString& origin_url,
  31. const CefString& accept_lang,
  32. JSDialogType dialog_type,
  33. const CefString& message_text,
  34. const CefString& default_prompt_text,
  35. CefRefPtr callback,
  36. bool& suppress_message) {
  37.  
  38. if(dialog_type == JSDIALOGTYPE_ALERT)//普通提示框 询问框
  39. {
  40. string strTemp = message_text.ToString();
  41. CString strMsg = _T("");
  42. ConvertUtf8ToGBK(strTemp,strMsg);
  43.  
  44. CCommonDlg dlg;
  45. dlg.setShowText(strMsg);
  46. dlg.setShowIcon();
  47. dlg.setButtonContent(_T(""),_T("确 定"));
  48. dlg.setShowTip(_T("提示"));
  49.  
  50. dlg.DoModal();
  51.  
  52. suppress_message = true;
  53. return false;
  54. }
  55. else if(dialog_type == JSDIALOGTYPE_CONFIRM)//询问框
  56. {
  57. string strTemp = message_text.ToString();
  58. CString strMsg = _T("");
  59. ConvertUtf8ToGBK(strTemp,strMsg);
  60.  
  61. CCommonDlg dlg;
  62. dlg.setShowText(strMsg);
  63. dlg.setShowIcon();
  64. dlg.setButtonContent(_T("确 定"),_T("取 消"));
  65. dlg.setShowTip(_T("询问"));
  66.  
  67. dlg.DoModal();
  68.  
  69. if( == dlg.m_nReturnValue)
  70. {
  71. callback->Continue(true,"");
  72. suppress_message = false;
  73. return true;
  74. }
  75. else
  76. {
  77. callback->Continue(false,"");
  78. suppress_message = false;
  79. return true;
  80.  
  81. }
  82.  
  83. }
  84. else if(dialog_type == JSDIALOGTYPE_PROMPT)//输入框,不支持
  85. {
  86. CCommonDlg dlg;
  87. dlg.setShowText(_T("系统不支持prompt形式的提示框"));
  88. dlg.setShowIcon();
  89. dlg.setButtonContent(_T(""),_T("确 定"));
  90. dlg.setShowTip(_T("提示"));
  91.  
  92. dlg.DoModal();
  93.  
  94. suppress_message = true;
  95. return false;
  96. }
  97.  
  98. return false;
  99.  
  100. }
  101.  
  102. 说明:CCommonDlg 是笔者写的一个提示框,读者也可以用MessageBox代替。ConvertUtf8ToGBK 只是一个字符串处理方法,如下:
  103. void ConvertUtf8ToGBK(string strUtf8,CString &strRet)
  104. {
  105. int len = MultiByteToWideChar(CP_UTF8, , (LPCSTR)strUtf8.c_str(), -, NULL,);
  106. TCHAR * wszGBK = new TCHAR[len+];
  107. ZeroMemory(wszGBK,len+);
  108.  
  109. MultiByteToWideChar(CP_UTF8, , (LPCSTR)strUtf8.c_str(), -, wszGBK, len);
  110.  
  111. strRet.Format(_T("%s"),wszGBK);
  112.  
  113. delete []wszGBK;
  114.  
  115. return;
  116.  
  117. }
  118.  
  119. 参数解释
  120. suppress_message参数:
  121.  
  122. 如果这个参数被设置为true,并且函数返回值为false,将阻止页面打开JS的弹出窗口。
  123.  
  124. 如果这个参数被设置为false,并且函数返回值也是false,页面将会打开这个JS弹出窗口。
  125.  
  126. message_text参数:
  127.  
  128. 是弹出窗口将要显示的内容
  129.  
  130. dialogType参数:
  131.  
  132. 是弹出窗口的类型(alert,confirm,Prompt
  133.  
  134. callback参数:
  135.  
  136. 当用户点击了弹出窗口的确定按钮,可以用callback.Continue(true, string.Empty);回调确定函数
  137.  
  138. 当用户点击了弹出窗口的取消按钮,可以用callback.Continue(false, string.Empty);回调取消函数
  139.  
  140. 测试
  141. 在测试页面实现如下代码:
  142.  
  143. function AlertTest() {
  144. //alert('弹框测试');
  145.  
  146. if(confirm('您同意吗?'))
  147. {
  148. alert('同意');
  149. }
  150. }

原帖地址: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遇见普罗米修斯

    Jerry每次在工作场合中同Prometheus(普罗米修斯)打交道时,都会"出戏",因为这个单词给我的第一印象,并不是用go语言实现的微服务监控利器,而是名导雷德利·斯科特(Ri ...

  2. JENKINS安卓打包CI

    jenkins构建脚本: [root@localhost tomcat]# cat move.sh #!/bin/bash # author lql release_dir=/data/android ...

  3. intellij IDEA github clone 指定分支代码

    1.问题描述 在实际开发中,我们通常会使用idea克隆一个新项目(clone),通常情况下,我们默认克隆的是master分支,但是如果master分支只是一个空文件夹而已,真正的代码在develop分 ...

  4. mysql 设置查看字符集

    MySQL查看和修改字符集的方法   一.查看字符集 1.查看MYSQL数据库服务器和数据库字符集 方法一:show variables like '%character%';方法二:show var ...

  5. 宿主机计划任务执行docker相关命令

    这个问题拖了好几个月百思不解,或许是由于基础不牢的缘故;百度等等搜索一大篇,还真有人遇到了相似问题 问题:宿主机写好计划任务,是mongodump命令来备份mongo数据库,结果在计划任务里是执行不了 ...

  6. webapi之owin的oauth2.0密码模式_01概述

    一般在webapi接口中,为了防止接口被随意调用,都会验证用户身份. 然而不能每次调用接口都需要用户输入用户名密码来验证,这时就需要授权颁发令牌了,持有令牌就可以访问接口,接口也能验证令牌身份. 简单 ...

  7. 2013.6.29 - OpenNER第九天

    上午看计算机网络,下午做计算机实验.晚上写计算机实验报告,还有OpenStack的实验报告. 写完之后跟师兄讨论了一下OpenNER的事情,觉得OpenNE很像是化学物质,里面很多都可以构成原子团,原 ...

  8. Navicat Premium 12破解激活11

    下载Navicat Premium 12并安装: 百度云下载:Navicat Premium 12注册机   链接:https://pan.baidu.com/s/1UcA5yXjtdfXlBZI-2 ...

  9. SQL进阶系列之7用SQL进行集合运算

    写在前面 集合论是SQL语言的根基,因为这种特性,SQL也被称为面向集合语言 导入篇:集合运算的几个注意事项 注意事项1:SQL能操作具有重复行的集合(multiset.bag),可以通过可选项ALL ...

  10. el-table 多列显示隐藏造成内容错乱