WebBrowser脚本错误的完美解决⽅案
当IE浏览器遇到脚本错误时浏览器,左下⾓会出现⼀个黄⾊图标,点击可以查看脚本错误的详细信息,并不会有弹出的错误信息框。当我们使⽤WebBrowser控件时有错误信息框弹出,这样程序显的很不友好,⽽且会让⼀些⾃动执⾏的程序暂停。我看到有⼈采取的解决⽅案是做⼀个窗体杀⼿程序来关闭弹出的窗体。今天探讨的⽅法是从控件解决问题。
1、SHDocVw.dll
在COM时代我们使⽤的WebBrowser控件是SHDocVw.dll。屏蔽错误信息的⽅法很简单使⽤下⾯的⼀句就可以搞定。
WebBrowser1.Silent = true
2、.Net中
在.Net中提供了托管的WebBrowser可供我们使⽤,当然我们仍然可以在.Net中使⽤COM组建SHDocVw.dll,如果使⽤SHDocVw.dll
处理错误⽅式和上⾯的⽅法⼀样。但如果我们是使⽤.Net组件如何解决这个问题呢?
这个组件给我们提供了⼀个⽅法ScriptErrorsSuppressed 。但是在 framework2.0中他是不起作⽤的,据说在低版本中使⽤如下的⽅式解决
webBrowser1.ScriptErrorsSuppressed = true(据说在 framework2.0以前是这样,我没有使⽤过)
那么在 framework2.0中如何解决这个问题呢?
有⼀种⽅法不能彻底解决,可以部分解决问题这⾥也介绍给⼤家。
//捕获控件的错误
this.WebBrowser.Document.Window.Error += new HtmlElementErrorEventHandler(Window_Error);
//对错误进⾏处理
void Window_Error(object sender, HtmlElementErrorEventArgs e)
{
// ⾃⼰的处理代码
e.Handled = true;
}
上⾯的⽅法对于多个框架嵌套等等的情形还是不能很好的解决。
为了彻底解决这个问题,我们借助AxWebBrowser来解决WebBrowser的问题。
我们定义⼀个⾃⼰的类,他的⽗类是WebBrowser,以后使⽤这个类就可以了。在这个类的定义中需要引⽤SHDocVw。
class EWebBrowser : System.Windows.Forms.WebBrowser
{
SHDocVw.IWebBrowser2 Iwb2;
protected override void AttachInterfaces(object nativeActiveXObject)
{
Iwb2 = (SHDocVw.IWebBrowser2)nativeActiveXObject;
Iwb2.Silent = true;
base.AttachInterfaces(nativeActiveXObject);
}
protected override void DetachInterfaces()
脚本发生错误怎么办{
Iwb2 = null;
base.DetachInterfaces();
}
}
从上⾯的代码可以看出EWebBrowser截取了AxWebBrowser接⼝,并利⽤了AxWebBrowser的属性Silent来实现。