Delphi TWebBrowser无法在本地运行Javascript代码

4
我有一个非常简单的Delphi XE7程序。它基本上只是一个嵌入在窗体中的TWebBrowser组件,除了一个触发Browser.Navigate方法的按钮之外,没有附加任何额外的代码。我的理解是TWebBrowser只是IE的ActiveX包装器。
我试图使用它来显示一个非常简单的页面,该页面引用D3 Javascript库(但目前不做任何操作),并且网页是从运行在我的PC上的WAMPSERVER上的本地主机web服务器提供的。
网页在Chrome或IE 11中运行得非常好(我有Windows 7,64位)。但是当我尝试在Delphi / TWebBrowser程序中查看它们时,我会收到IE错误消息“此页面上的脚本发生错误”(请参见附加的图像)。当尝试访问位于本地主机上的d3test / d3文件夹中的d3.js javascript库时,似乎会出现错误。我已经验证了d3.js文件确实存在于此文件夹中,并且这似乎得到证实,因为该页面在Chrome和IE中都可以运行和显示得很好。
也许有一个嵌入式Web浏览器访问本地托管页面的问题?其他背景-我还清除了IE缓存,在Windows控制面板上重置了Internet选项,将IE安全设置为最低级别,并且暂时禁用了我的Norton防火墙/病毒扫描程序。
有人对此有什么想法吗?我真的希望能够在基于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>

enter image description here


3
我认为问题可能在于默认情况下嵌入的WebBrowser2窗口(TWebBrowser使用它们)以IE7兼容模式运行。请查看https://dev59.com/QV8e5IYBdhLWcg3wVJTH#25843958获取解决方法。 - SilverWarior
1
非常感谢!通常情况下,我发帖后就发现可以通过在HTML的<head>代码中添加以下内容来解决问题:<meta http-equiv="X-UA-Compatible" content="IE=edge" />。 - CHEAPS
1
@CHEAPS:是的,您可以添加元标记,但正确的解决方案是添加注册表键。您可以将其添加到HKCU中,这样您的程序就不应该有创建此键的问题... - whosrdaddy
好的 - 我会做 - 感谢大家! - CHEAPS
2
从技术角度来说,微软并未正式支持注册表设置,并且不保证任何特定的设置会在下一个版本(甚至在下一个补丁/更新之后)得到支持。然而,x-ua-compatible头部被正式记录并且支持IE8到IE11。(在IE 11中,该功能已被弃用,这是一个正式步骤,最终导致未来的非支持。)实际上,regkey可以使用,但需要对每个工作站进行更新,而头部仅需添加一次。正确答案应根据个人需求而变化。 - Lance Leonard
2个回答

7

我在问题下方添加了你的评论的答案,希望对其他人有所帮助

将这个元标签添加到你的网页中

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

end;

最后,在你的表单的OnCreate事件中添加:

TBrowserEmulationAdjuster.SetBrowserEmulationDWORD(TBrowserEmulationAdjuster.IE11_Quirks);

这应该可以解决你的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接