如何让Delphi TWebbrowser组件在IE9模式下运行?

如何让Delphi TWebbrowser组件在IE9模式下运行?,delphi,twebbrowser,Delphi,Twebbrowser,由于TWebbrowser在IE7兼容模式下运行,我在TWebbrowser中遇到Javascript错误 有没有办法防止这种情况,让它在IE9模式下运行 选择加入该网站 根据您选择的浏览器模拟设置,您可能需要确保文档包含合适的DOCTYPE。同样,这在中进行了描述 因此,例如,如果您希望进行最简单的更改,您可以添加以下注册表设置: HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER) SOFTWARE Microsoft Int

由于TWebbrowser在IE7兼容模式下运行,我在TWebbrowser中遇到Javascript错误

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

  • 选择加入该网站
  • 根据您选择的浏览器模拟设置,您可能需要确保文档包含合适的DOCTYPE。同样,这在中进行了描述
  • 因此,例如,如果您希望进行最简单的更改,您可以添加以下注册表设置:

    HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER) SOFTWARE Microsoft Internet Explorer Main FeatureControl FEATURE_BROWSER_EMULATION YourExeNameGoesHere.exe = (DWORD) 00009999 HKEY_本地_机器(或HKEY_当前用户) 软件 微软 Internet Explorer 主要 特性控制 功能\u浏览器\u仿真 YourExenameGoesher.exe=(DWORD)00009999 值
    9999
    的文档说明:

    9999Windows Internet Explorer 9。网页以IE9标准模式显示,而不考虑!DOCTYPE指令

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

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

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

    包括在html中,“http equiv=“X-UA-Compatible”content=“IE=edge”

    
    你的代码。。。。
    
    将此类添加到代码中:

    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;
    
    结束

    然后将以下内容添加到表单的OnCreate中:

    TBrowserEmulationAdjuster.SetBrowserEmulationDWORD(TBrowserEmulationAdjuster.IE11_Quirks);
    

    这是所有永久的

    可能不考虑依赖于IE的正确版本的可能的复制品,通过使用像嵌入的铬(查找DCEF)之类的东西。@ThijsvanDien:这一点很好,但使用DCEF时,您必须提供外部DLL,这并不总是需要的。TY.此解决方案有效。对于64位操作系统上的32位应用程序,您需要在…SOFTWARE\Wow6432Node\Microsoft\…下添加条目。这是正确的。除非您使用的
    HKCU\SOFTWARE
    没有单独的32位和64位视图。O当然,如果您在安装程序中添加了设置,那么注册表重定向器将为您完成这项工作并重定向到32位视图。假设您的32位程序安装了32位安装程序。虽然有点离题,但仍然与您相关:如果您使用TwebBrowser,此网站可能会对您有很大帮助:@DavidHeffernan我建议使用updateing在回答中提供有关如何确保TwebBrowser以最新仿真模式运行(例如IE11)的信息因为这似乎是Delphi中最常见的关于TWebBrowser和仿真模式问题的答案。我知道这个问题是专门针对IE9仿真提出的,但是否真的需要有人提出一个关于TWebBrowser IE11仿真模式的新问题,这个问题的答案几乎相同,只有不同的需要用于实现IE11仿真的DWORD值中的ncemode@DavidHeffernan另一方面,当其他人在他们的答案中链接到异地资源时,你经常抱怨。此外,SO的目的不是提供常见问题的答案,而不是指向如何获得这些答案?请注意,此元标记必须是e头部分中的第一个标记和
    也必须设置。
    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;
    
    TBrowserEmulationAdjuster.SetBrowserEmulationDWORD(TBrowserEmulationAdjuster.IE11_Quirks);