通过 JavaScript 打开 CHM 帮助文件到特定页面

Open CHM help file to a specific page via JavaScript

这里有很多关于这个主题的帖子,但是 none 是从网页启动 CHM 帮助文件的解决方案。

背景:

CHM 文件及其中每个页面的路径取自 JSON 文件,并且根据需要在 CHM 中访问的页面,将 link 连接起来。例如 chm/myHelp.chm::cat2page1.html.

因此,对于 ActionScript,当用户单击按钮时,此函数会创建完整的字符串并传递给包含 HTML 页面中名为“callJavascript”的 JavaScript 函数,该函数又会打开CHM 文件到正确的页面:

private function launchURL(e:MouseEvent) {
        if (_helpLibIndex != "" && _myHelpLink != "") {
            // ex: JavaScript:   callJavascript('chm/GloCyte.chm::cat2page1.html')
            var variableStr:String = _helpLibIndex + "::" + _myHelpPageLink;
            ExternalInterface.call("callJavascript", variableStr );
        }
    }

以及托管 Flash swf 的 HTML 页面上的 JavaScript:

<script type="text/javascript">
        function callJavascript(str) {
            //window.alert(str);
            window.showHelp(str);
        }
    </script>

应该很容易转换为纯 JS - 对吧?不幸的是我有很多问题。

这是我在新 HTML5 页面中的 JS 代码。 _helpLibIndex 和 _myHelpLink 是先前从导入的 JSON 文件中检索到的:

function launchURL() {
if (_helpLibIndex != "" && _myHelpLink != "") {
   // appending myHelpLink gives 404 error.
   // leaving it off kinda launches the CHM, but no content is viewable in the body area 
   // example string = 'chm/myHelp.chm::cat2page1.html'

   var variableStr = _helpLibIndex + "::" + _myHelpLink;

   window.showHelp(variableStr);

   console.log("attempted to launch the showHelp file. URL is: " + variableStr);

}

我不太明白在这种情况下工作的 ActionScript 和 JavaScript 不工作的区别,因为这两种情况下的最终调用都是来自托管网页的 JS。非常感谢任何帮助!

简短的故事 - 查看 ITS (CHM) 文件时使用完整路径。根据我的测试,包括 CHM 中的主题规范在内的相对路径规范不起作用。它仅适用于 CHM 帮助文件本身。

多年前的一系列安全修复已将 HTML帮助减少为仅作为本地帮助。也许这已得到不同的修复。

我希望能给你一个想法,但你必须根据自己的需要对其进行调整(你提到使用 IE11)。我没有使用 Flash ActionScript 的经验,因为它也一直存在安全问题。所以,我不知道为什么 ActionScript 在这种情况下可以工作,而 JavaScript 不能。

HTML 帮助 1.x 无法通过 http 提供压缩帮助。您可以指向用户本地驱动器上的 .chm,也可以 link 指向 .chm 进行下载,但仅此而已。

查看 ITS (CHM) 文件内部的能力是 Microsoft Internet Explorer 独有的。只有 Internet Explorer(不是 Microsoft Edge 浏览器)可以加载本地路径,例如:

ms-its:D:\_temp\CHM-example.chm::/garden/garden.htm

前缀 ms-its 是早期的可插入协议,它遵循万维网联盟 (W3C) 制定的旧标准。 ms-its 协议适用于 Microsoft Internet Explorer 4.0 或更高版本,但并非所有浏览器都支持。

所以,我在同一个本地有一个test.htm文件和一个CHM-example.chm文件D:\_working 文件夹。请注意 window.showHelp 在外部应用程序(帮助查看器 hh.exe)中打开 HTML 帮助文件 (.chm)。

请确保使用 Internet Explorer 11(上下文菜单,使用 IE11 打开)对此进行测试。 AFAIK - showHelp() 不是 javascript(或 JScript)函数 - 它是 Microsoft Internet Explorer DHTML 方法。

<!DOCTYPE html>
<html lang="en">
<head>
    <script type="text/javascript">
            
        function OpenHelpFile () {
            // open help file in help viewer - IE 11 only
            // --------------------------------------------------------
            // for optional use cases when CHM resides in another place
            // var DriveStr = "D:";
            // var SubFolderStr = "_working";
            
            var HelpFileName = "CHM-example.chm";
            var HelpFileStr = HelpFileName;
            
            // open help file topic in help viewer - IE 11 only
            // --------------------------------------------------------
            <!-- window.showHelp ("CHM-example.chm", null) -->
            alert ("attempted to launch the showHelp file. URL is: " + HelpFileStr);
            window.showHelp (HelpFileStr);
        }

        function OpenHelpTopic () {
            //  open help file topic in help viewer - IE 11 only
            // --------------------------------------------------------
            var DriveStr = "D:";
            var SubFolderStr = "_working";
            var HelpFileName = "CHM-example.chm";
            var HelpTopicStr = DriveStr + "\" + SubFolderStr + "\" + HelpFileName + "::" + "/garden/flowers.htm";   
            
            // open help file topic in help viewer - IE 11 only
            // --------------------------------------------------------
            <!-- window.showHelp ("D:\_working\CHM-example.chm::/garden/flowers.htm", null) -->
            alert ("attempted to launch the showHelp file. URL is: " + HelpTopicStr);
            window.showHelp (HelpTopicStr);
        }

        function OpenHelpTopicInNewTab () {
            // open help topic in new tab - only working inside IE11 using ms-its protocol
            // ---------------------------------------------------------------------------
            // "ms-its:D:\_working\CHM-example.chm::/garden/garden.htm"
        
            var ProtocolStr = "ms-its:";
            var DriveStr = "D:";
            var PathToFileStr = "\_working\CHM-example.chm";
            var HelpTopicStr = ProtocolStr + DriveStr + PathToFileStr + "::" + "/garden/garden.htm";
            
            alert ("attempted to launch the showHelp file. URL is: " + HelpTopicStr);
            
            // please note: window.open (!) ---------------------------------------------
            window.open (HelpTopicStr, null);
        }
        
    </script>
</head>
<body>
<p>Help Information www.help-info.de</p>
<hr />
<p>Open a help file</p>
<div>
    <button onclick="OpenHelpFile ();">Open a help file!</button>
</div>
<hr />
<p>Open a help topic</p>
<div>
    <button onclick="OpenHelpTopic ();">Open a help topic!</button>
</div>
<hr />
<p>Open a help topic in a new browser tab</p>
<div>
    <button onclick="OpenHelpTopicInNewTab ();">Open a help topic in a new browser tab!</button>
</div>
</body>

按钮步骤(2 和 3)产生了下面的屏幕截图(请注意第二个浏览器选项卡是第三个按钮的结果)。

您可能想从我的HTML帮助 (HH) 信息站点 see download section or download directly from CHM.

下载上面使用的 CHM-example.chm 文件

编辑:(评论后)

将此 CHM 文件保存到本地驱动器后的第一步:请检查 如果双击 CHM 文件后内容已完全显示在主题中 window在右边。

如果没有请注意 - 要打开此 CHM 文件,请右键单击该文件,单击 属性 ,然后选中 取消阻止并单击确定,如下面的屏幕截图所示:

在同一目录中使用上述代码创建 test.htm 后,确保使用 Internet Explorer 打开 允许阻止的内容.

出于安全原因,浏览器底部带有按钮 window 的消息将在大约 10 秒后自动消失。