2013-02-26 14:16
444人阅读
收藏
举报
WebBrowser或CHtmlView中屏蔽脚本错误
━━━━━━━━━━━━━━━━━━━━━━━━
一、我现在的方法是在void CMyHtmlView::OnInitialUpdate()中添加SetSilent(true);
并且要设置IE的高级选项,方法如下:
禁用脚本调试
如果错误消息是问题的唯一症状,并且网站正在运行,则可以忽略此错误。另外,
如果此问题仅在一个或两个网页上发生,则可能是这些网页的问题。如果您决定忽略该错误,则可以禁用脚本调试。
注意:如果此问题不只在一个或两个站点上发生,请不要禁用脚本调试。现在请转到方法 2。
要在 Internet Explorer 6 中关闭脚本调试程序,请按照下列步骤操作:
1.在“工具”菜单上,单击“Internet 选项”。
2.在“高级”选项卡上,单击以选中“禁用脚本调试”复选框,然后单击“确定”。
注:请参考HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\BROWSE\SCRIPT_DEBUGGER
━━━━━━━━━━━━━━━━━━━━━━━━
二、以下方法来自网络:
转自:http://www.cnblogs.com/zhangqingping/archive/2009/06/16/1504260.html
WebBrowser或CHtmlView中轻松屏蔽脚本错误(JavaScript)
1.什么是javascript脚本错误
1.1 概述
JavaScript脚本错误包含“运行时错误”和“语法错误”。
1.2 JavaScript“语法错误”
JavaScript语法错误是指当 JavaScript语句违反了 JavaScript脚本语言的一条或多条语法规则时导致的错误。JavaScript语法错误发生在程序编译阶段,在开始运行该程序之前。
1.3 JavaScript“运行时错误”
JavaScript运行时错误是指当 JavaScript脚本试图执行一个系统不能运行的动作时导致的错误。当正在运行脚本、计算变量表达式、或者正在动态分配内存时出现 JavaScript运行时错误时。
2. 为什么要屏蔽javascript脚本错误?
由于开发海纳产品时,使用WebBrowser和CHtmlView来展示页面,进行填表等操作;但是由于打开的页面大多是其他用户的CMS页面,所以难免有些有脚本错误,于是决定要来屏蔽脚本错误,提升产品的易用性和友好性。
3. 怎么去屏蔽javascript脚本错误?
3.1 使用SetSilent函数
使用WebBrowser或CHtmlView的SetSilent函数可以达到屏蔽脚本错误的目的,不过这种情况,其它提示信息也都不显示了,例如使用alert进行的错误提示。
如果你觉得这样能满足你,那么推荐使用这种方法,简单啊!
3.2 重载IOleCommandTarget的Exec函数
网上比较多资料都是说重载IOleCommandTarget中的Exec函数来进行屏蔽脚本错,定义如下:
HRESULT Exec( const GUID* pguidCmdGroup, DWORD nCmdID,
DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut )
然后通过判断nCmdID是否等于OLECMDID_SHOWSCRIPTERROR(即报javascript脚本错误)来进行屏蔽;由于本人对COM
和OLE的知识有限,琢磨了半天也没有想到怎么实现IOleCommandTarget接口中的Exec函数,然后跟我的WebBrowser或是
HtmlView挂钩起来,于是决定放弃这种方法,有兴趣的朋友可以查看参考资料的文章继续尝试一下。
3.3 另一种方法
不死心,继续在网上找,突然发现了一篇文章,介绍在html页面中,可以使用javascript的事件来进行javascript脚本错误的屏蔽,于是拷贝下来尝试,果然有用(即使IE浏览器设置了脚本调试,也不会进行提示),经改造的代码如下:
<html>
<head>
<script type="text/javascript" >
function fnObjNotDefine(){
domethod();
}
function fnOnError(msg,url,lineno){
<!--
alert("window.onerror\n\n" +
"Error: " + msg + "\n" +
"URL: " + url + "\n" +
"Line: " + lineno);
return true; -->
}
window.onerror = fnOnError;
MethodName.badcommand();
function fnOnLoad(){
alert("on load!");
}
</script>
</head>
<body onload="fnOnLoad();">
<input type="button" value="function not defined" onclick="badcommand();">
<input type="button" value="object not defined" onclick="fnObjNotDefine();">
</body>
</html> |
通过查看javascript代码,发现是“重载”了window.onerror这个事件,只要它返回true,脚本错误就不显示了,估计这个就是
Microsoft自己实现的截取javascript脚本错误信息的接口,于是就想怎么把它插入到页面当中,其中有篇文章介绍说在
OnDocumentComplete时来实现javascript的插入,经实践,这种方法是不行的;经过本人的不断尝试,发现在
OnNavigateComplete2或OnNavigateComplete里实现javascript的注入是可行的,这两个函数只要实现一个就
行,就看你用的是Navigate2还是Navigate来打开页面了。这里使用Navigate2来做例子,具体代码如下:
注:记得包含头文件#include <Atlbase.h>否则编译通不过
void CMyWebBrowser::OnNavigateComplete2(LPCTSTR strURL)
{
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)
{
//屏蔽javascript脚本错误的javascript脚本
CString strJavaScriptCode = "function
fnOnError(msg,url,lineno){alert('script
error:\\n\\nURL:'+url+'\\n\\nMSG:'+msg +'\\n\\nLine:'+lineno);return
true;}window.onerror=fnOnError;";
BSTR bstrScript = strJavaScriptCode.AllocSysString();
CString strLanguage("JavaScript");
BSTR bstrLanguage = strLanguage.AllocSysString();
long lTime = 1 * 1000;
| |