1.什么是javascript脚本错误

1.1    概述

JavaScript脚本错误包含“运行时错误”和“语法错误”。

1.2    JavaScript“语法错误”

JavaScript语法错误是指当 JavaScript语句违反了 JavaScript脚本语言的一条或多条语法规则时导致的错误。JavaScript语法错误发生在程序编译阶段,在开始运行该程序之前。

1.3    JavaScript“运行时错误”

JavaScript运行时错误是指当 JavaScript脚本试图执行一个系统不能运行的动作时导致的错误。当正在运行脚本、计算变量表达式、或者正在动态分配内存时出现 JavaScript运行时错误时。

2.    为什么要屏蔽javascript脚本错误?

由于开发海纳产品时,使用WebBrowserCHtmlView来展示页面,进行填表等操作;但是由于打开的页面大多是其他用户的CMS页面,所以难免有些有脚本错误,于是决定要来屏蔽脚本错误,提升产品的易用性和友好性。

3.    怎么去屏蔽javascript脚本错误?

3.1    使用SetSilent函数

使用WebBrowserCHtmlViewSetSilent函数可以达到屏蔽脚本错误的目的,不过这种情况,其它提示信息也都不显示了,例如使用alert进行的错误提示。

如果你觉得这样能满足你,那么推荐使用这种方法,简单啊!WebBrowser或CHtmlView中轻松屏蔽脚本错误(JavaScript)

3.2    重载IOleCommandTargetExec函数

网上比较多资料都是说重载IOleCommandTarget中的Exec函数来进行屏蔽脚本错,定义如下:

HRESULT  Exec( const GUID* pguidCmdGroup, DWORD nCmdID,

      DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut )

 然后通过判断nCmdID是否等于OLECMDID_SHOWSCRIPTERROR(即报javascript脚本错误)来进行屏蔽;由于本人对COMOLE的知识有限,琢磨了半天也没有想到怎么实现IOleCommandTarget接口中的Exec函数,然后跟我的WebBrowser或是HtmlView挂钩起来WebBrowser或CHtmlView中轻松屏蔽脚本错误(JavaScript),于是决定放弃这种方法,有兴趣的朋友可以查看参考资料的文章继续尝试一下。

3.3    另一种方法

不死心,继续在网上找,突然发现了一篇文章,介绍在html页面中,可以使用javascript的事件来进行javascript脚本错误的屏蔽,于是拷贝下来尝试,果然有用(即使IE浏览器设置了脚本调试,也不会进行提示WebBrowser或CHtmlView中轻松屏蔽脚本错误(JavaScript)),经改造的代码如下:


 1WebBrowser或CHtmlView中轻松屏蔽脚本错误(JavaScript)<html>
 2WebBrowser或CHtmlView中轻松屏蔽脚本错误(JavaScript)<head>
 3

 

通过查看javascript代码,发现是“重载window.onerror这个事件,只要它返回true,脚本错误就不显示了,估计这个就是Microsoft自己实现的截取javascript脚本错误信息的接口WebBrowser或CHtmlView中轻松屏蔽脚本错误(JavaScript),于是就想怎么把它插入到页面当中,其中有篇文章介绍说在OnDocumentComplete时来实现javascript的插入,经实践,这种方法是不行的;经过本人的不断尝试,发现在OnNavigateComplete2OnNavigateComplete里实现javascript的注入是可行的,这两个函数只要实现一个就行,就看你用的是Navigate2还是Navigate来打开页面了。这里使用Navigate2来做例子,具体代码如下:

 

 1WebBrowser或CHtmlView中轻松屏蔽脚本错误(JavaScript)void CMyWebBrowser::OnNavigateComplete2(LPCTSTR strURL)
 2WebBrowser或CHtmlView中轻松屏蔽脚本错误(JavaScript)
 3}

其中,CMyWebBrowser是我自己继承了CHtmlView类的一个实现类, 这个函数可以在你的WebBrowser2或继承了CHtmlView类中实现,编写一个带有脚本错误的页面,打开进行浏览,是不是发现脚本错误被屏蔽了? 哈哈,实现起来也不麻烦。于是就把这个方法贴出来,供大家参考WebBrowser或CHtmlView中轻松屏蔽脚本错误(JavaScript)

另: 经测试,发现如果存在iframe嵌套的时候,嵌套的iframe中包含脚本错误,以上方法是不能屏蔽iframe中的脚本错误的,因为window.onerror只针对当前页面有效,因此需要在OnNavigateComplete2函数里加上对当前页面进行递归所有子页面,然后重复执行execScript操作即可。

最终代码为:


  1WebBrowser或CHtmlView中轻松屏蔽脚本错误(JavaScript)void CMyWebBrowser::OnNavigateComplete2(LPCTSTR strURL)
  2WebBrowser或CHtmlView中轻松屏蔽脚本错误(JavaScript)
  3}

 

目前存在的一个缺陷是OnNavigateComplete2会被调用多次,那么嵌入javascript的操作也会被执行多次(不知道会产生什么副作用,目前尚未发现)CMyWebBrowserCHtmlView类继承,代码在VC2008VC6.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

相关文章:

  • 2022-12-23
  • 2021-09-30
  • 2021-12-20
  • 2022-12-23
  • 2022-12-23
  • 2021-12-10
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-01-10
  • 2021-11-21
  • 2021-12-15
  • 2021-06-06
  • 2021-07-12
相关资源
相似解决方案