The "[子程序名称]未定义" 当 HTA 文档模式为 9 或更高并且从 HTML 代码调用子例程时会发生错误without括号。
在这种特殊情况下,代码onClick="CheckService"
本来应该:onClick="CheckService()"
请注意,此 HTA 的文档模式是不明确的,因为它被声明为:
<meta http-equiv="x-ua-compatible" content="IE=edge">
这会导致 HTA 中的 HTML 代码使用 MSHTML.dll 提供的最高文档模式呈现。与edge浏览器无关.
在具有 MSHTML 8 或更低版本的计算机上测试此 HTA 的人不会看到错误。在任何具有 MSHTML 9 或更高版本的计算机上,都会发生该错误。请注意,MSHTML 9 对应于 2011 年发布的 Internet Explorer 9。因此,到 2013 年,当发布此问题时,大多数计算机都会收到发布的脚本错误。
非官方接受的答案通过删除meta线,导致 HTA 运行IE 7模式,在 HTML 代码中调用子例程时不需要括号。在这种情况下,降级 HTA 文档模式可能不会产生负面影响,但可能会导致 HTML/CSS 代码产生与预期不同的结果。
有关 HTA 文档模式的更多背景信息:
HTA 应瞄准specific文档模式以确保 HTML/CSS 代码始终按预期工作。这ie=edge选项只能由包含不同 MSHTML 版本的多个 HTML 代码部分的专家编码人员使用。现在它已经过时了,因为任何生产中的机器都应该有 MSHTML 11,它于 2013 年发布,并且永远不会有任何进一步的升级。 (注意:Windows 11 包含 MSHTML 11,因此 HTA 仍然有效。)通常,HTA 应针对 IE=9、IE=10 或 IE=11。选择这三种文档模式中的一种有一些具体原因,但那是完全不同的讨论。
HTA 通常应以如下代码开头:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" http-equiv="X-UA-Compatible" content="IE=9">
<hta:application id=oHTA>
</head>
如果您的 HTA 没有DOCTYPE or X-UA-兼容声明,它将运行在IE 5默认模式。如果它只有DOCTYPE声明,它将运行在IE 7默认模式。然而,如果有一个FEATURE_BROWSER_EMULATION注册表设置为执行程序,那么default模式将是该注册表值中设置的任何内容。
如果您的 HTA 有X-UA-兼容声明,无论任何注册表设置如何,它都将以该模式运行(假设计算机没有旧版本的 MSHTML),因此请务必包含meta如上所示的行(注意:UTF-8 部分是可选的,但对于使用特殊字符很有帮助)。