zoukankan      html  css  js  c++  java
  • CEF拦截js层alert弹窗 OnJSDialog 《转》

    一 引言

    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('同意');
       }
    }

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

  • 相关阅读:
    Tensorflow实战(1)
    一切重新开始!!!!!!!!
    二、单片机——串口通信及超声波(下)
    一、单片机——串口通信及超声波(上)
    Java小项目之远程桌面显示(摘自蓝桥老师视屏)
    Java小项目之Login界面理解MVC(MySQL数据库基本操作)
    Java小项目之拼图游戏
    暑假学习计划:Day_3.JavaBean
    暑假学习计划:Day_2. Response,Out,Config,Exception,pageContext对象。
    暑假学习计划:Day_1.JSP&Servlet&Tomcat 环境搭建到基础的认识。
  • 原文地址:https://www.cnblogs.com/wainiwann/p/11534460.html
Copyright © 2011-2022 走看看