一 引言

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. 【等待事件】等待事件系列(5.1)--Enqueue(队列等待)

    [等待事件]等待事件系列(5.1)--Enqueue(队列等待)   1  BLOG文档结构图   2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可 ...

  2. python的常见内置模块之-----time

    1.time模块 a.时间戳:print(time.time())  从1970年到现在的时间,秒数 import time print(time.time()) >>>157448 ...

  3. eclipse svn 提交、更新报错

    问题描述: svn: Unable to connect to a repository at URL 'https://test.com/svn/clouds/trunk/fire_Alarm'sv ...

  4. 使用10046追踪执行计划demo

    (一)开启10046追踪 SQL> alter session set events '10046 trace name context forever,level 12'; (二)执行sql语 ...

  5. ZMQ应用

    一.  ZeroMQ概述 ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型.连接处理.帧.甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字.ZeroMQ是网络通信中新的一层,介于应 ...

  6. Xshell连接虚拟机中的Ubuntu

    虚拟机中安装好Ubuntu系统后使用cmd测试ping 设置xshell的连接ip 连接 连接失败 安装openssh-server sudo apt install openssh-server 再 ...

  7. PAT甲级1005水题飘过

    题目分析:用一个字符串输入之后遍历每一位求和后,不断%10获取最后一位存储下来,逆序用对应的英文单词输出(注意输入为0的情况) #include<iostream> #include< ...

  8. django项目中使用bootstrap插件的分页功能。

    官网下载bootstrap插件放到项目中的static文件中 路由 path('blog-fullwidth/', login.fullwidth,name='fullwidth'), 前端页面引入 ...

  9. 【原创】python+selenium,用xlrd,读取excel数据,执行测试用例

    # -*- coding: utf-8 -*- import unittest import time from selenium import webdriver import xlrd,xlwt ...

  10. sqoop从oracle数据库抽取数据,导入到hive

    环境: hadoop-2.7.5 sqoop-1.4.7 zookeeper-3.4.10 hive-2.3.3 (使用mysql配置元数据库) jdk1.8.0_151 oracle 11.2.0. ...