使用WPF WebBrowser控件时如何禁止脚本错误?

wil*_*lem 47 browser wpf

我有一个WPF应用程序,它使用WPF WebBrowser控件在平板显示器(如新闻源)上向开发人员显示有趣的网页.

麻烦的是,我偶尔会得到一个HTML脚本错误,弹出一个讨厌的IE错误消息,询问我是否要"停止在此页面上运行脚本".有没有办法抑制这个错误检查?

注意:我已经在IE设置中禁用了脚本调试.

Wol*_*lf5 124

这是我刚用反射做出的解决方案.解决问题:)我在Navigated事件中运行它,因为似乎activeX对象在此之前不可用.

它的作用是在底层的activeX对象上设置.Silent属性.这与Windows窗体等效的.ScriptErrorsSuppressed属性相同.

 public void HideScriptErrors(WebBrowser wb, bool Hide) {
    FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);
    if (fiComWebBrowser == null) return;
    object objComWebBrowser = fiComWebBrowser.GetValue(wb);
    if (objComWebBrowser == null) return;
    objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { Hide });
 }
Run Code Online (Sandbox Code Playgroud)

一个更好的版本,可以在任何时候运行,而不是在.Navigated事件之后运行:

public void HideScriptErrors(WebBrowser wb, bool hide) {
    var fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);
    if (fiComWebBrowser == null) return;
    var objComWebBrowser = fiComWebBrowser.GetValue(wb);
    if (objComWebBrowser == null) {
        wb.Loaded += (o, s) => HideScriptErrors(wb, hide); //In case we are to early
        return;
    }
    objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { hide });
}
Run Code Online (Sandbox Code Playgroud)

如果对第二个样本有任何问题,请尝试交换wb.Loaded with wb.Navigated.

  • var wb = new WebBrowser(); wb.Navigated + =(a,b)=> {HideScriptErrors(wb,true); }; 只需要运行一次,但你明白了.您无法设置该属性,直到触发了Navigated事件. (5认同)

Car*_*rol 9

刚从另一个问题中找到,这很优雅,效果很好.

dynamic activeX = this.webBrowser1.GetType().InvokeMember("ActiveXInstance",
                BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic,
                null, this.webBrowser1, new object[] { });

activeX.Silent = true;
Run Code Online (Sandbox Code Playgroud)


Kyl*_*ndo 7

这里的问题是WPF WebBrowser没有像2.0控件那样实现这个属性.

最好的办法是WindowsFormsHost在WPF应用程序中使用a 并使用2.0的WebBrowser属性:SuppressScriptErrors.即使这样,您也需要完全信任该应用程序才能执行此操作.

不是人们所说的理想,但它几乎是目前唯一的选择.


Ash*_*ian 5

我还发现了一种禁用JavaScript错误的有趣方法。但是由于使用优雅的动态类型,因此至少需要使用.Net Framework 4.0。

您需要预订WebBrowser元素的LoadCompleted事件:

<WebBrowser x:Name="Browser" 
            LoadCompleted="Browser_OnLoadCompleted" />
Run Code Online (Sandbox Code Playgroud)

之后,您需要编写一个如下所示的事件处理程序:

    void Browser_OnLoadCompleted(object sender, NavigationEventArgs e)
    {
        var browser = sender as WebBrowser;

        if (browser == null || browser.Document == null)
            return;

        dynamic document = browser.Document;

        if (document.readyState != "complete")
            return;

        dynamic script = document.createElement("script");
        script.type = @"text/javascript";
        script.text = @"window.onerror = function(msg,url,line){return true;}";
        document.head.appendChild(script);
    }
Run Code Online (Sandbox Code Playgroud)


ale*_*exb 5

我想将此添加为对@Alkampfer答案的评论,但我没有足够的声誉.这适用于我(Windows 8.1,NET 4.5):

 window.Browser.LoadCompleted.Add(fun _ -> 
    window.Browser.Source <- new System.Uri("javascript:window.onerror=function(msg,url,line){return true;};void(0);"))
Run Code Online (Sandbox Code Playgroud)

这段代码示例是用F#编写的,但很清楚它是做什么的.