我有一个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.
刚从另一个问题中找到,这很优雅,效果很好.
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)
这里的问题是WPF WebBrowser没有像2.0控件那样实现这个属性.
最好的办法是WindowsFormsHost在WPF应用程序中使用a 并使用2.0的WebBrowser属性:SuppressScriptErrors.即使这样,您也需要完全信任该应用程序才能执行此操作.
不是人们所说的理想,但它几乎是目前唯一的选择.
我还发现了一种禁用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)
我想将此添加为对@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#编写的,但很清楚它是做什么的.
| 归档时间: |
|
| 查看次数: |
44697 次 |
| 最近记录: |