【问题标题】:How to have Delphi TWebbrowser component running in IE9 mode?如何让 Delphi TWebbrowser 组件在 IE9 模式下运行?
【发布时间】:2014-11-08 17:33:37
【问题描述】:

由于 TWebbrowser 在 IE7 兼容模式下运行,我在使用 TWebbrowser 时遇到 Javascript 错误。

有没有办法防止这种情况,让它在 IE9 模式下运行?

【问题讨论】:

标签: delphi twebbrowser


【解决方案1】:
  1. 选择加入browser emulation feature using the documented registry key。
  2. 根据您选择的浏览器模拟设置,您可能需要确保您的文档包含合适的 DOCTYPE。同样,这在documentation 中有描述。

因此,例如,如果您希望进行最简单的更改,您可以添加以下注册表设置:

HKEY_LOCAL_MACHINE(或 HKEY_CURRENT_USER) 软件 微软 IE浏览器 主要的 功能控制 FEATURE_BROWSER_EMULATION YourExeNameGoesHere.exe = (DWORD) 00009999

值9999 的文档说:

9999 Windows Internet Explorer 9。网页以 IE9 标准模式显示,与 !DOCTYPE 指令无关。

如果您使用9000,那么您还需要修改文档的 DOCTYPE:

9000 Internet Explorer 9。包含基于标准的 !DOCTYPE 指令的网页以 IE9 模式显示。 Internet Explorer 9 的默认值。

链接的文档还包括指定其他 IE 版本所需的信息。

【讨论】:

  • TY。此解决方案有效。对于 64 位操作系统上的 32 位应用程序,您需要在 ...SOFTWARE\Wow6432Node\Microsoft\...下添加条目...
  • 没错。除非您使用没有单独的 32 位和 64 位视图的 HKCU\Software。当然,如果您在安装程序中添加设置,那么注册表重定向器将为您完成工作并重定向到 32 位视图。假设您的 32 位程序安装了 32 位安装程序。
  • 有点离题,但仍然与您相关:如果您正在使用 TwebBrowser,此站点可以为您提供很多帮助:delphidabbler.com/articles?article=21
  • @DavidHeffernan 我建议使用有关如何确保 TwebBrowser 以最新仿真模式(例如 IE11)运行的信息更新您的答案,因为这似乎是关于 TWebBrowser 和仿真的最常见答案Delphi中的模式问题。我知道这个问题是专门针对 IE9 仿真而提出的,但是否真的有必要创建一个关于 TWebBrowser IE11 仿真模式的新问题,该问题将得到几乎相同的答案,只是需要用于实现 IE11 的 DWORD 值不同仿真模式
  • @DavidHeffernan 另一方面,当其他人在他们的答案中链接到非现场资源时,您经常会抱怨。此外,SO 的目的不是提供常见问题的答案,而不是提供如何获得这些答案的要点吗?
【解决方案2】:

包含在 html 中," http-equiv="X-UA-Compatible" content="IE=edge"

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" http-equiv="X-UA-Compatible" content="IE=edge" />
</head>
<body> 
                your code ....
</body>
</html>

【讨论】:

  • 注意这个meta标签必须是head部分的first标签,&lt;!DOCTYPE html&gt;也必须设置。
【解决方案3】:

将此类添加到您的代码中:

type TBrowserEmulationAdjuster = class
  private
      class function GetExeName(): String; inline;
   public const
      // Quelle: https://msdn.microsoft.com/library/ee330730.aspx, Stand: 2017-04-26
      IE11_default   = 11000;
      IE11_Quirks    = 11001;
      IE10_force     = 10001;
      IE10_default   = 10000;
      IE9_Quirks     = 9999;
      IE9_default    = 9000;
      /// <summary>
      /// Webpages containing standards-based !DOCTYPE directives are displayed in IE7
      /// Standards mode. Default value for applications hosting the WebBrowser Control.
      /// </summary>
      IE7_embedded   = 7000;
   public
      class procedure SetBrowserEmulationDWORD(const value: DWORD);
end platform;

class function TBrowserEmulationAdjuster.GetExeName(): String;
begin
    Result := TPath.GetFileName( ParamStr(0) );
end;

class procedure TBrowserEmulationAdjuster.SetBrowserEmulationDWORD(const value: DWORD);
const registryPath = 'Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION';
var
    registry:   TRegistry;
    exeName:   String;
begin
    exeName := GetExeName();

    registry := TRegistry.Create(KEY_SET_VALUE);
    try
       registry.RootKey := HKEY_CURRENT_USER;
       Win32Check( registry.OpenKey(registryPath, True) );
       registry.WriteInteger(exeName, value)
    finally
       registry.Destroy();
    end;

结束;

然后添加到您的 OnCreate 表单中:

TBrowserEmulationAdjuster.SetBrowserEmulationDWORD(TBrowserEmulationAdjuster.IE11_Quirks);

这就是永远

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 2010-12-30
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多