前言:
在Windows客户端程序中展示网页,以前常用CHtmlView。最近发现高版本VS中有CDHtmlDialog,试了一下,发现更好用。就只说 JS 与 C++ 代码互相调用方面,基本都是两三行语句搞定,是比CHtmlView方便了太多。
正文:
CDHtmlDialog 如何 屏蔽脚本错误呢?网上搜了下,有一种解决办法是这样的(CMyDialog是 自定义的CDHtmlDialog的子类):
BOOL CMyDialog::OnInitDialog(){
...
m_pBrowserApp->put_Silent(VARIANT_TRUE);
}
经测试,没有效果(win7 + vs2013)
网上搜了半天也尝试了很多,终于发现一个有效的办法。如果在web页面上,加上这一段:
<script type="text/javascript">
function MyErrorFunc(){
return true;
}
window.onerror = MyErrorFunc
</script>
就能屏蔽脚本错误弹窗了。猜测这相当于用自己的实现重写web默认onerror函数。所以如果能在所有网页中加上这一段脚本,就能实现目的了。那客户端如何实现呢?
看代码:
思路:在页面加载完毕(OnNavigateComplete)时,注入脚本(屏蔽报错)
void CMyDialog::OnNavigateComplete(LPDISPATCH pDisp, LPCTSTR szUrl)
{
CDHtmlDialog::OnNavigateComplete(pDisp, szUrl);
SuppressScriptError(); // 屏蔽脚本报错
}
void CMyDialog::SuppressScriptError()
{
// 要执行的屏蔽报错脚本
CString strScript = _T("window.οnerrοr=function myonerror(){return true}");
CString strLanguage("JavaScript");
ExecuteScript(strScript, strLanguage);
}
void CMyDialog::ExecuteScript(CString &strScript, CString &strLanguage)
{
IHTMLDocument2* pIHtmlDoc = NULL;
GetDHtmlDocument(&pIHtmlDoc);
if (!pIHtmlDoc) return;
IHTMLWindow2* pIhtmlwindow2 = NULL;
pIHtmlDoc->get_parentWindow(&pIhtmlwindow2);
if (!pIhtmlwindow2) return;
BSTR bstrScript = strScript.AllocSysString();
BSTR bstrLanguage = strLanguage.AllocSysString();
VARIANT pRet;
// 注入脚本到当前页面
pIhtmlwindow2->execScript(bstrScript, bstrLanguage, &pRet);
::SysFreeString(bstrScript);
::SysFreeString(bstrLanguage);
pIhtmlwindow2->Release();
}
经测试,有效(win7 + vs2013)
参考资料:https://www.douban.com/note/188909792/