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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM