CEF拦截js层alert弹窗|CEF拦截js层alert弹窗 OnJSDialog 《转》

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

1 继承,为 ClientHandler 添加一个父类 CefJSDialogHandler class ClientHandler : public CefJSDialogHandler2 声明,在 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('同意'); } }

【CEF拦截js层alert弹窗|CEF拦截js层alert弹窗 OnJSDialog 《转》】原帖地址:http://blog.sina.com.cn/s/blog_dad2c54101019cm6.html
转载于:https://www.cnblogs.com/wainiwann/p/11534460.html

    推荐阅读