WebBrowser 控件和 JavaScript 错误
Posted
技术标签:
【中文标题】WebBrowser 控件和 JavaScript 错误【英文标题】:WebBrowser control and JavaScript errors 【发布时间】:2011-07-28 15:04:04 【问题描述】:当我用浏览器(ie9)访问页面时,浏览器渲染正常。
当我使用 WebBrowser 控件时出现 javascript 错误。
我知道我可以抑制脚本错误,但我希望它们正确运行,因为它们会影响页面的呈现和功能。
我该如何解决这个问题?我可以直接在 Windows 窗体中集成 IE9 并使用与 WebBrowser 控件类似的方法(导航、获取 id、调用单击)吗?
谢谢。
【问题讨论】:
【参考方案1】:我要做的是将一个对象分配给 webbrowser.ObjectForScripting,然后注入一个 javascript 函数,该函数将 windown.onerror 分配给调用宿主应用程序中的外部脚本的包装器。喜欢:
window.onerror = function(message, url, lineNumber)
window.external.errorHandler(message, url, lineNumber);
参考: http://notions.okuda.ca/2009/06/11/calling-javascript-in-a-webbrowser-control-from-c/
【讨论】:
【参考方案2】:如果您安装了 IE9,WebBrowser 仍将使用 IE7 模式,除非您使用注册表设置覆盖此行为 - 如*** answer 中所述。这是您在 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);
【讨论】:
我确实使用我的 exe 文件名添加了这些条目,但我仍然在浏览器控件中收到 JavaScript 错误。我没有在浏览器中获取它们(IE10)。 @zoidbergi - 尝试运行 xmlquire-we(一旦具有管理员权限来设置注册表更改) - 看看当您在浏览器控件的地址栏中输入 URL 时是否遇到相同的错误 - 可从qutoric.com/xmlquire/ce @daniel 你可能搞砸了。甚至可以让它在 Edge 浏览器模式下工作。请阅读这篇文章:weblog.west-wind.com/posts/2011/May/21/…【参考方案3】:您可以使用以下代码行来消除这些类型的错误:
webBrowser1.ScriptErrorsSuppressed = true;
它将防止出现 JavaScript 错误。
【讨论】:
来自问题:“我知道我可以抑制脚本错误,但我希望它们能够正确运行,因为它们会影响页面的呈现和功能。” @mgokhanbakal 在哪里放置代码?正如它所说,您无法在设计器或构建中将其更改为 true。如果我将它放在 .cs 文件中,它会失败。 @Sidso,你可以把它添加到你加载页面的地方。【参考方案4】:所以我知道这篇文章已经过时了,但这对我来说是最近才出现的问题,我不得不进行一些认真的挖掘和跳出框框思考。
基本上就像这里的大多数回复一样 - 您不能更改 webbrowser 控件以使用最新的 IE 引擎。我的默认使用 IE7,我看到一些回复基本上会更改/向注册表添加内容,在涉及注册表时总是不舒服,解决此问题的更简洁的方法是在您的网站上附加代码以强制它在任何电脑上使用最新的 IE 引擎,工作起来就像一个魅力。
如果您有权访问您要浏览的页面的 web.config 文件,请简单附加:
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
<add name="X-UA-Compatible" value="IE=edge" />
</customHeaders>
</httpProtocol>
</system.webServer>
您的网站会强制 webbrowser 控件在您的计算机上运行最新的 IE 引擎。其他选项可在此处找到:
https://www.leapinggorilla.com/Blog/Read/1016/ie-ate-my-css---disabling-compatability-mode
我应该声明,这只有在您有权访问您尝试访问的网站/应用程序的页面/web.config 时才有效——这就是我的情况。
【讨论】:
【参考方案5】:WebBrowser
控件使用 IE7。因此,如果出现问题,那么您的脚本不适用于 IE7,您必须修复它。
您不能集成 IE9,因为它取决于它是否安装在计算机上,并不是每个人都安装了 IE9。
【讨论】:
我的电脑上安装了 IE9。我正在访问我在网站上拥有的帐户。使用 webbrowser 控件,我在该帐户中自动执行某些操作。在网络浏览器中,我收到影响网站功能的 javascript 错误。我在 IE 浏览器中没有收到此错误。如何找到使用 webBrowser 控制器的浏览器版本? @user689792 如答案所述,无论您安装了什么,该控件始终使用 IE7 @OskarKjellin:实际上,确实如此。您可以使用IE9或机器上安装的IE。 @Jack 自 2011 年以来可能已经改变了;) 默认模式是IE7,但可以通过注册表中的功能仿真模式轻松更改。【参考方案6】:作为对可能遇到此问题的其他人的帮助,我尝试了所有这些方法,但对我没有任何帮助。这就是有效的方法。我不确定究竟是什么导致了这个错误,但显然当你在 VS 中按“F5”来调试你的应用程序时,它会运行 YourProject.vshost.exe 作为进程名称。如果您从命令行运行相同的应用程序,它将显示为 YourProject.exe,并且 javascript 错误消失。我认为 IE 通过 VSHOST 看到应用程序正在运行签证,并认为这是可疑的并禁用了正确加载 javascript。
所以...进入可执行文件的项目设置。 选择“调试”选项。 选择“启动外部程序”。 浏览并选择 Debug\YourProgram.exe(不是 YourProgram.vshost.exe)。 保存,重新编译,然后按 F5。
现在一切都应该照常工作了,Visual Studio 甚至会自动为您附加到该进程。
享受吧!
格雷戈
【讨论】:
以上是关于WebBrowser 控件和 JavaScript 错误的主要内容,如果未能解决你的问题,请参考以下文章
如何从托管 WebBrowser 控件的应用程序调用 WebBrowser 控件查看的页面中的 JavaScript 函数?
MFC 中的 WebBrowser 控件 — 如何注入 Javascript?
JavaScript 未在 .NET WebBrowser 控件中执行
在 WebBrowser 控件中禁用 JavaScript 错误