如何在CHtmlView中禁用、屏蔽JavaScript JS 的执行

 

首先在CHtmlView派生的子类中重写OnAmbientProperty事件。
实现代码如下:

01BOOL CMyHtmlView::OnAmbientProperty(COleControlSite* pSite, DISPID dispid, VARIANT* pvar)
02{
03// TODO: 在此添加专用代码和/或调用基类
04if(dispid == DISPID_AMBIENT_DLCONTROL)
05{
06pvar->vt = VT_I4;
07pvar->iVal = DLCTL_NO_SCRIPTS;
08returntrue;
09}
10returnCHtmlView::OnAmbientProperty(pSite, dispid, pvar);
11}

pvar->iVal后面的参数解释如下:  
DLCTL_BGSOUNDS 浏览器组件播放同文档相联的背景声音;
DLCTL_DLIMAGES 浏览器组件从服务器下载图形;
DLCTL_DOWNLOADONLY 浏览器组件下载页面但不显示;
DLCTL_FORCEOFFLINE 浏览器组件工作在脱机方式。通过 URLMON 提出请求时, 即使计算机连接了互联网,也设置 BINDF_OFFLINEOPERATION 标志;
DLCTL_NO_BEHAVIORS 浏览器组件不执行任何行为;
DLCTL_NO_CLIENTPULL 浏览器组件不执行任何客户端的 pull 操作;
DLCTL_NO_DLACTIVEXCTLS 浏览器组件不下载文档中的任何 ActiveX 控件;
DLCTL_NO_FRAMEDOWNLOAD 浏览器组件对包含框架的页面进行语法分析但不下载任何帧, 同时忽略框架,不翻译任何 frame 标记;
DLCTL_NO_JAVA浏览器组件不执行任何 Java applet;
DLCTL_NO_METACHARSET 浏览器组件隐藏文档中的 META 元素指示的字符集;
DLCTL_NO_RUNACTIVEXCTLS 浏览器组件不执行文档中的任何 ActiveX 控件;
DLCTL_NO_SCRIPTS 浏览器组件不执行任何脚本;
DLCTL_OFFLINE 与 DLCTL_OFFLINEIFNOTCONNECTED 相同;
DLCTL_OFFLINEIFNOTCONNECTED 如果未连接互联网,浏览器组件将以脱机方式工作。通过URLMON 提出请求时,即使计算机连接了互联网,也设置 BINDF_GETFROMCACHE_IF_NET_FAIL 标志;
DLCTL_PRAGMA_NO_CACHE 浏览器组件迫使请求发送给服务器并忽略代理,即使代理指明 数据是最新的也是如此。通过 URLMON 提出请求时,设置 BINDF_PRAGMA_NO_CACHE 标志;
DLCTL_RESYNCHRONIZE 浏览器组件忽略缓存中的数据并向服务器请求更新。如果服务器指明 缓存中的数据是更新了的则使用缓存数据。通过 URLMON 提出 请求时,设置BINDF_RESYNCHRONIZE 标志;
DLCTL_SILENT 浏览器组件不显示用户界面。通过 URLMON 提出请求时,设置BINDF_SILENTOPERATION 标志;
DLCTL_URL_ENCODING_DISABLE_UTF8 浏览器组件禁止 UTF-8 编码;
DLCTL_URL_ENCODING_ENABLE_UTF8 浏览器组件允许 UTF-8 编码;
DLCTL_VIDEOS 浏览器组件播放文档中包含的视频片断。

 

屏蔽JS脚本执行:

void C******View::OnNavigateComplete2(LPCTSTR strURL)
{
// TODO: Add your specialized code here and/or call the base class

CComPtr<IDispatch> spDisp = GetHtmlDocument();
if(spDisp!=NULL)
{
CComPtr<IHTMLDocument2> doc;
spDisp->QueryInterface(IID_IHTMLDocument2, reinterpret_cast<void**>(&doc));
if(doc != NULL)
{
IHTMLWindow2 * pIhtmlwindow2 = NULL;
doc->get_parentWindow(&pIhtmlwindow2);
if(pIhtmlwindow2 != NULL)
{//”function fnOnError(msg,url,lineno){alert(‘script error:\\n\\nURL:’+url+’\\n\\nMSG:’+msg +’\\n\\nLine:’+lineno);return true;}window.οnerrοr=fnOnError;”;
//屏蔽javascript脚本错误的javascript脚本
CString strJavaScriptCode = “function fnOnError(){return true;}window.οnerrοr=fnOnError;”;
BSTR bstrScript = strJavaScriptCode.AllocSysString();
CString strLanguage(“JavaScript”);
BSTR bstrLanguage = strLanguage.AllocSysString();
long lTime = 1 * 1000;
long lTimeID = 0;
VARIANT varLanguage;
varLanguage.vt = VT_BSTR;
varLanguage.bstrVal = bstrLanguage;
VARIANT pRet;
//把window.onerror函数插入入当前页面中去
pIhtmlwindow2->execScript(bstrScript, bstrLanguage, &pRet);
::SysFreeString(bstrScript);
::SysFreeString(bstrLanguage);
pIhtmlwindow2->Release();
}
}
}
CHtmlView::OnNavigateComplete2(strURL);
}

以及:

void C*******View::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel)
{
// TODO: Add your specialized code here and/or call the base class

SetSilent(true);

CHtmlView::OnBeforeNavigate2(lpszURL, nFlags, lpszTargetFrameName, baPostedData, lpszHeaders, pbCancel);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值