【问题标题】:Delphi TWebBrowser Wont Run Javascript from LocalHostDelphi TWebBrowser 无法从 LocalHost 运行 Javascript
【发布时间】:2015-06-11 12:30:33
【问题描述】:

我有一个非常简单的 Delphi XE7 程序。它基本上只是一个嵌入在表单中的 TWebBrowser 组件,没有附加额外的代码,除了一个触发 Browser.Navigate 方法的按钮。我的理解是 TWebBrowser 只是 IE 的 ActiveX 包装器。

我正在尝试使用它来显示一个非常简单的页面,该页面引用了 D3 Javascript 库(但到目前为止还没有对它做任何事情),并且这些网页是从我的 PC 上运行的本地主机网络服务器提供的使用 WAMPSERVER。

网页在 Chrome 或 IE 11 中运行良好(我有 Windows 7、64 位)。但是,当我尝试在 Delphi/TWebBrowser 程序中查看它们时,我收到 IE 错误消息“此页面上的脚本发生错误”(参见附图)。尝试访问本地主机上 d3test/d3 文件夹中的 d3.js javascript 库时似乎会发生该错误。我已验证此文件夹中确实存在 d3.js 文件,这似乎可以通过页面在 Chrome 和 IE 中运行和显示都很好的事实得到证实。

也许嵌入式网络浏览器访问本地托管页面存在问题?其他背景 - 我还清除了 IE 缓存、重置 Windows 控制面板上的 Internet 选项、将 IE 安全设​​置设置为最低级别并暂时禁用我的诺顿防火墙/病毒扫描程序。

有人对此有任何想法吗?我真的希望能够在我的基于 Windows 的程序中嵌入一些 D3 图表。

这里也是html代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>D3 Test</title>
<script type="text/javascript" src="d3\d3.js"></script>
</head>
<body>
Hello World
</body>
</html>

【问题讨论】:

  • 我相信问题可能在于默认情况下任何嵌入式 WebBrowser2 Windows(TWebBrowser 使用它们)在 IE7 兼容模式下运行。检查stackoverflow.com/a/25843958/3636228 的解决方法
  • 非常感谢!通常,我还发现(在发布上述内容之后)我可以通过将以下内容添加到 html 代码来解决问题:
  • @CHEAPS:是的,您可以添加元标记,但正确的解决方案是添加注册表项。您可以将其添加到 HKCU,这样您的程序在创建此密钥时应该没有问题...
  • 好的 - 会的 - 谢谢大家!
  • 从技术上讲,Microsoft 不正式支持注册表设置,并且不保证任何特定设置将在下一个版本中得到支持(甚至在下一个补丁/更新之后)。但是,x-ua-compatible 标头已正式记录并支持 IE8 到 IE11。 (在 IE 11 中,该功能已被弃用,这是一个正式步骤,最终导致未来不支持。)实际上,regkey 有效,但需要更新每个工作站,而标题只添加一次。正确答案应该因人而异。

标签: javascript html delphi internet-explorer


【解决方案1】:

我在问题下方添加了您的 cmets 的答案,因此可能 对他人有帮助

将此元标记添加到您的网页中

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

【讨论】:

    【解决方案2】:

    在这种情况下,您应该将此类添加到您的代码中:

    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);
    

    这应该可以解决您的问题

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2010-12-30
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      相关资源
      最近更新 更多