一 引言
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
class ClientHandler : public CefJSDialogHandler
2 声明,在 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;
}
3 实现:
在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(1);
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(3);
dlg.setButtonContent(_T("确 定"),_T("取 消"));
dlg.setShowTip(_T("询问"));
dlg.DoModal();
if(1 == 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(1);
dlg.setButtonContent(_T(""),_T("确 定"));
dlg.setShowTip(_T("提示"));
dlg.DoModal();
suppress_message = true;
return false;
}
return false;
}
4 说明:CCommonDlg 是笔者写的一个提示框,读者也可以用MessageBox代替。ConvertUtf8ToGBK 只是一个字符串处理方法,如下:
void ConvertUtf8ToGBK(string strUtf8,CString &strRet)
{
int len = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)strUtf8.c_str(), -1, NULL,0);
TCHAR * wszGBK = new TCHAR[len+10];
ZeroMemory(wszGBK,len+10);
MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)strUtf8.c_str(), -1, wszGBK, len);
strRet.Format(_T("%s"),wszGBK);
delete []wszGBK;
return;
}
5 参数解释
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('同意');
}
}