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进行的错误提示。
如果你觉得这样能满足你,那么推荐使用这种方法,简单啊!![](https://www.cnblogs.com/Emoticons/msn/tongue_smile.gif)
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浏览器设置了脚本调试,也不会进行提示
),经改造的代码如下:
1
<
html
>
2
<
head
>
3
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<
script
type
="text/javascript"
>
4![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
function fnObjNotDefine()
{
6
domethod();
7
}
8![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
function fnOnError(msg,url,lineno)
{
10
<!--
11
alert("window.onerror\n\n" +
12
"Error: " + msg + "\n" +
13
"URL: " + url + "\n" +
14
"Line: " + lineno);
15
return true; -->
16
}
17
window.onerror = fnOnError;
18
MethodName.badcommand();
19![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
function fnOnLoad()
{
21
alert("on load!");
22
}
23
</
script
>
24
</
head
>
25
<
body
onload
="fnOnLoad();"
>
26
<
input
type
="button"
value
="function not defined"
onclick
="badcommand();"
>
27
<
input
type
="button"
value
="object not defined"
onclick
="fnObjNotDefine();"
>
28
</
body
>
29
</
html
>
30
通过查看javascript代码,发现是“重载”了window.onerror这个事件,只要它返回true,脚本错误就不显示了,估计这个就是Microsoft自己实现的截取javascript脚本错误信息的接口,于是就想怎么把它插入到页面当中,其中有篇文章介绍说在OnDocumentComplete时来实现javascript的插入,经实践,这种方法是不行的;经过本人的不断尝试,发现在OnNavigateComplete2或OnNavigateComplete里实现javascript的注入是可行的,这两个函数只要实现一个就行,就看你用的是Navigate2还是Navigate来打开页面了。这里使用Navigate2来做例子,具体代码如下:
1
void
CMyWebBrowser::OnNavigateComplete2(LPCTSTR strURL)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
4![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
CComPtr<IDispatch> spDisp = GetHtmlDocument();
6![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
if(spDisp != NULL)
8![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
10![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
CComPtr<IHTMLDocument2> doc;
12![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
spDisp->QueryInterface(IID_IHTMLDocument2, reinterpret_cast<void**>(&doc));
14![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
if(doc != NULL)
16![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
18![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
IHTMLWindow2 * pIhtmlwindow2 = NULL;
20![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
doc->get_parentWindow(&pIhtmlwindow2);
22![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
if(pIhtmlwindow2 != NULL)
24![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
26![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
//屏蔽javascript脚本错误的javascript脚本
28![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
CString strJavaScriptCode = "function fnOnError(msg,url,lineno){alert('script error:\\n\\nURL:'+url+'\\n\\nMSG:'+msg +'\\n\\nLine:'+lineno);return true;}window.οnerrοr=fnOnError;";
30![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31
BSTR bstrScript = strJavaScriptCode.AllocSysString();
32![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33
CString strLanguage("JavaScript");
34![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
BSTR bstrLanguage = strLanguage.AllocSysString();
36![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
long lTime = 1 * 1000;
38![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
39
long lTimeID = 0;
40![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
41
VARIANT varLanguage;
42![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
43
varLanguage.vt = VT_BSTR;
44![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
45
varLanguage.bstrVal = bstrLanguage;
46![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
47
VARIANT pRet;
48![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
//把window.onerror函数插入入当前页面中去
50![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
51
pIhtmlwindow2->execScript(bstrScript, bstrLanguage, &pRet);
52![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
53
::SysFreeString(bstrScript);
54![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
55
::SysFreeString(bstrLanguage);
56![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
57
58![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
59
pIhtmlwindow2->Release();
60![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
61
}
62![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
63
}
64![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
65
}
66![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
67
}
其中,CMyWebBrowser是我自己继承了CHtmlView类的一个实现类, 这个函数可以在你的WebBrowser2或继承了CHtmlView类中实现,编写一个带有脚本错误的页面,打开进行浏览,是不是发现脚本错误被屏蔽了? 哈哈,实现起来也不麻烦。于是就把这个方法贴出来,供大家参考
。
另: 经测试,发现如果存在iframe嵌套的时候,嵌套的iframe中包含脚本错误,以上方法是不能屏蔽iframe中的脚本错误的,因为window.onerror只针对当前页面有效,因此需要在OnNavigateComplete2函数里加上对当前页面进行递归所有子页面,然后重复执行execScript操作即可。
最终代码为:
1
void
CMyWebBrowser::OnNavigateComplete2(LPCTSTR strURL)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
4![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
CComPtr<IDispatch> spDisp = GetHtmlDocument();
6![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
if(spDisp != NULL)
8![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
10![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
CComPtr<IHTMLDocument2> doc;
12![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
spDisp->QueryInterface(IID_IHTMLDocument2, reinterpret_cast<void**>(&doc));
14![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
if(doc != NULL)
16![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
18![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
CScriptErrHandler scriptHandler;
20![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
scriptHandler.ShieldCurrPage(doc);
22![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
scriptHandler.ShieldAllChildPages(doc);
24![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
}
26![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
}
28![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
}
30
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
31
ScriptErrHandler.cpp文件:
32
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
33
#include
"
StdAfx.h
"
34
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
35
#include
"
ScriptErrHandler.h
"
36
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
37
CScriptErrHandler::CScriptErrHandler(
void
)
38
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
39
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
40![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
41
CString strJavaScriptCode = "function fnOnError(msg,url,lineno){alert('script error:\\n\\nURL:'+url"
42![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
43
"+'\\n\\nMSG:'+msg +'\\n\\nLine:'+lineno+'\\n\\nframes:' + window.frames.length);return true;}window.οnerrοr=fnOnError;";
44![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
45
46![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
47
//屏蔽的脚本,可以改进为从文本里读取
48![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
m_bstrScript = strJavaScriptCode.AllocSysString();
50![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
51
}
52
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
53
54
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
55
CScriptErrHandler::
~
CScriptErrHandler(
void
)
56
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
57
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
58![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
59
SysFreeString(m_bstrScript);
60![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
61
}
62
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
63
64
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
65
66
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
67
void
CScriptErrHandler::ShieldCurrPage(CComPtr
<
IHTMLDocument2
>
&
doc)
68
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
69
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
70![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
71
CComPtr<IHTMLWindow2> spIhtmlwindow2;
72![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
73
doc->get_parentWindow(reinterpret_cast<IHTMLWindow2**>(&spIhtmlwindow2));
74![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
75
if(spIhtmlwindow2 != NULL)
76![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
77![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
78![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
79
CString strLanguage("JavaScript");
80![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
81
BSTR bstrLanguage = strLanguage.AllocSysString();
82![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
83
long lTime = 1 * 1000;
84![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
85
long lTimeID = 0;
86![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
87
VARIANT varLanguage;
88![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
89
varLanguage.vt = VT_BSTR;
90![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
91
varLanguage.bstrVal = bstrLanguage;
92![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
93
VARIANT pRet;
94![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
95
//把window.onerror函数插入入当前页面中去
96![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
97
spIhtmlwindow2->execScript(m_bstrScript, bstrLanguage, &pRet);
98![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
99
::SysFreeString(bstrLanguage);
100![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
101
}
102![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
103
}
104
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
105
106
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
107
void
CScriptErrHandler::ShieldAllChildPages(CComPtr
<
IHTMLDocument2
>
&
parentDoc)
108
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
109
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
110![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
111
WalkAllChildPages(parentDoc);
112![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
113
}
114
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
115
116
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
117
void
CScriptErrHandler::WalkAllChildPages(CComPtr
<
IHTMLDocument2
>
&
parentDoc)
118
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
119
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
120![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
121
CComPtr<IHTMLFramesCollection2> spFramesCol;
122![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
123
HRESULT hr = parentDoc->get_frames(&spFramesCol);
124![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
125
if(SUCCEEDED(hr) && spFramesCol != NULL)
126![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
127![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
128![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
129
long lSize = 0;
130![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
131
hr = spFramesCol->get_length(&lSize);
132![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
133
if (SUCCEEDED(hr))
134![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
135![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
136![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
137
for(int i=0; i<lSize; i++)
138![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
139![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
140![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
141
VARIANT frameRequested;
142![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
143
VARIANT frameOut;
144![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
145
frameRequested.vt = VT_UI4;
146![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
147
frameRequested.lVal = i;
148![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
149
hr = spFramesCol->item(&frameRequested, &frameOut);
150![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
151
if(SUCCEEDED(hr) && frameOut.pdispVal != NULL)
152![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
153![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
154![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
155
CComPtr<IHTMLWindow2> spChildWindow;
156![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
157
158![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
159
hr = frameOut.pdispVal->QueryInterface(IID_IHTMLWindow2,reinterpret_cast<void**>(&spChildWindow));
160![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
161
if(SUCCEEDED(hr) && spChildWindow != NULL)
162![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
163![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
164![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
165
CComPtr<IHTMLDocument2> spChildDocument;
166![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
167
hr = spChildWindow->get_document(reinterpret_cast<IHTMLDocument2**>(&spChildDocument));
168![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
169
if(SUCCEEDED(hr) && spChildDocument != NULL)
170![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
171![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
172![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
173
ShieldCurrPage(spChildDocument);
174![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
175
WalkAllChildPages(spChildDocument);
176![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
177
}
178![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
179
}
180![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
181
frameOut.pdispVal->Release();
182![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
183
}
184![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
185
}
186![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
187
}
188![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
189
}
190![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
191
}
目前存在的一个缺陷是OnNavigateComplete2会被调用多次,那么嵌入javascript的操作也会被执行多次(不知道会产生什么副作用,目前尚未发现);CMyWebBrowser从CHtmlView类继承,代码在VC2008和VC6.0下调试通过;若需要工程代码,请发送邮件到zhangqingping@hylanda.com 。
4. 参考资料
4.1 How to handle script errors as a WebBrowser control host
http://support.microsoft.com/default.aspx?scid=kb;en-us;261003
4.2 Script error notification is not sent to Exec method of WebBrowser Host
http://support.microsoft.com/kb/317024/en-us#top
4.3 How to Trap JScript Errors in Internet Explorer 4.01 and Earlier
http://support.microsoft.com/kb/183616/en-us