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

摘要:
嵌入CEF3介绍后,弹出带有JS的警报框。按钮放错地方了。确保按钮几乎看不见。环境:VS2008VCMFC第二个原则请参见CefJSDialogHandler类的描述。相关类:CefClientCefJSDialogHandlerClientHandler III准备使用cef_binary_3.1453.125_5_windows。7z在VS2008环境下建立MFC应用程序,并通过调试。本文主要描述重写JSDialog,不涉及其他内容。如果此参数设置为false,并且函数返回值也为false,则页面将打开此JS弹出窗口。

一 引言

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

免责声明:文章转载自《CEF拦截js层alert弹窗 OnJSDialog 《转》》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windows Live Writer for cnblogsflume kafka 配置指南下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

js FileReader 读取文件

前言:FileReader是一种异步文件读取机制,结合input:file可以很方便的读取本地文件。 input:file 在介绍FileReader之前,先简单介绍input的file类型。 <input type="file" id="inputBox"> input的file类型会渲染为一个按钮和一段文字。点击按钮可打开文件选择窗口,文字...

浅谈Js 操作Cookie,以及HttpOnly 的限制

. Js 操作 Cookie. 一般来说,只有服务器操作Cookie 才能保证一些必要的安全。但有时候,可能需要前端来增删改查 Cookie, 这个时候咱们的主角出现了——HttpOnly(๑•̀ㅂ•́) ✧. HttpOnly: HttpOnly is an additional flag included in a Set-Cookie HTTP re...

JS数据类型转换

JS数据类型转换方法主要有三种:转换函数、强制类型转换、利用js变量弱类型转换。 1、转换函数: js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。  在判断字符串是事是数字值前,...

JS来推断文本框内容改变事件

oninput,onpropertychange,onchange的使用方法 onchange触发事件必须满足两个条件: a)当前对象属性改变,而且是由键盘或鼠标事件激发的(脚本触发无效) b)当前对象失去焦点(onblur); onpropertychange的话,仅仅要当前对象属性发生改变,都会触发事件,可是它是IE专属的; oninput是onpr...

使用 js 测试 websocket 连接

参考:https://blog.csdn.net/linysuccess/article/details/109223712 配合上篇文章,代码如下: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <m...

JS编码转换[转载]

//转化成十六进制, 调用的是vbscript的Hex函数 function Hex(n) {    c = n;  execScript("c = Hex(c)", "vbscript");  return c; } //返回文字的AscaII编码, 调用的是vbscript的Asc函数 function Asc(s) {  c = s;  exec...