WebBrowser控件和JavaScript错误

use*_*792 21 .net javascript c# webbrowser-control winforms

当我使用浏览器(ie9)访问页面时,浏览器呈现正常.

当我使用WebBrowser控件时,我有JavaScript错误.

我知道我可以抑制脚本错误,但我希望它们能够正确运行,因为它们会影响页面的呈现和功能.

我怎么解决这个问题 ?我可以直接在Windows窗体中集成IE9,并使用类似于WebBrowser控件的方法(导航,获取ID,调用点击)?

谢谢.

小智 14

我要做的是将一个对象分配给webbrowser.ObjectForScripting,然后注入一个javascript函数,将windown.onerror分配给一个调用主机应用程序中的外部脚本的包装器.喜欢:

window.onerror = function(message, url, lineNumber) 
{ 
  window.external.errorHandler(message, url, lineNumber);
}
Run Code Online (Sandbox Code Playgroud)

参考:http://notions.okuda.ca/2009/06/11/calling-javascript-in-a-webbrowser-control-from-c/


pgf*_*aro 9

如果安装了IE9,WebBrowser仍将使用IE7模式,除非您使用注册表设置覆盖此行为 - 如此StackOverflow答案中所述.这是您在WebBrowser中获得的JavaScript错误的最可能原因(因为您在IE9中没有看到相同的错误).

您可以使用以下c#代码进行注册表设置(如果检测到Windows 8,则设置IE10模式)并更改app-name.exe以匹配您自己的应用程序.您应该为没有足够权限的情况添加错误处理程序(写入此注册表项需要管理员权限).

string installkey = @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
string entryLabel = "app-name.exe";
System.OperatingSystem osInfo = System.Environment.OSVersion;

string version = osInfo.Version.Major.ToString() + '.' + osInfo.Version.Minor.ToString();
uint editFlag = (uint)((version == "6.2") ? 0x2710 : 0x2328); // 6.2 = Windows 8 and therefore IE10

RegistryKey existingSubKey = Registry.LocalMachine.OpenSubKey(installkey, false); // readonly key

if (existingSubKey.GetValue(entryLabel) == null)
{
     existingSubKey = Registry.LocalMachine.OpenSubKey(installkey, true); // writable key
     existingSubKey.SetValue(entryLabel, unchecked((int)editFlag), RegistryValueKind.DWord);
}
Run Code Online (Sandbox Code Playgroud)


mgo*_*kal 9

您可以使用以下代码行来消除这些类型的错误:

webBrowser1.ScriptErrorsSuppressed = true;
Run Code Online (Sandbox Code Playgroud)

它可以防止出现JavaScript错误.

  • 来自问题:"我知道我可以抑制脚本错误,但我希望它们能够正确运行,因为它们会影响页面的渲染和功能." (2认同)

小智 7

所以我知道这篇文章很老,但这对我来说是一个最近的问题,我不得不在盒子外面进行一些认真的挖掘和思考.

基本上像这里的大多数回复 - 你不能改变webbrowser控件使用最新的IE引擎.我默认使用IE7,我看到一些回复基本上改变/添加到注册表的东西,在注册表时总是不舒服,解决这个问题的一个更简洁的方法是在你的网站上附加强制它的代码在任何一台电脑上使用最新的IE引擎,就像一个魅力.

如果您有权访问要浏览的页面的web.config文件,则简单追加:

    <system.webServer>
<httpProtocol>
    <customHeaders>
        <clear />
        <add name="X-UA-Compatible" value="IE=edge" />
    </customHeaders>
</httpProtocol>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

并且您的站点将强制webbrowser控件在您的计算机上运行最新的IE引擎.其他选项可在此处找到:

https://www.leapinggorilla.com/Blog/Read/1016/ie-ate-my-css---disabling-compatability-mode

我应该声明,只有当您可以访问您尝试访问的网站/应用程序的页面/ web.config时,这才有效 - 这就是我的情况.


Osk*_*lin 3

WebBrowser控件使用IE7。因此,如果出现问题,那么您的脚本不适用于 IE7,您必须修复该问题。

您无法集成 IE9,因为它取决于计算机上是否安装了 IE9,而且并非每个人都安装了 IE9。

  • 默认模式是 IE7,但可以通过注册表中的功能模拟模式轻松更改。 (2认同)