【问题标题】:通过 JavaScript 打开 CHM 帮助文件到特定页面
【发布时间】:2021-03-22 11:07:15
【问题描述】:

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

背景:

  • 这个项目不在互联网上,它是一个在运行 IE11 的医疗设备上本地运行的网站。
  • 之前编码为Flash ActionScript web app,成功使用了ActionScript的ExternalInterface.call("callJavascript", variableStr );打开 CHM 文件。不幸的是,该项目需要移植到 HTML5,我还没有找到可行的 JavaScript 解决方案。

CHM 文件和其中每个页面的路径取自 JSON 文件,并且根据需要在 CHM 中访问的页面,链接被连接起来。 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 页面中调用类似函数时,在将完整的 CHM 路径和页面连接在一起并将其传递给启动函数时,我收到 404 错误“找不到项目”。
  • 如果我离开页面而只使用 CHM 文件的路径,浏览器会提示“打开或保存”文件。当我选择“打开”时,CHM 文件在 Microsoft HTML 帮助控制版本 10.0 中启动到堆栈中的第一页,但仅显示页面导航面板,并且正文区域为空白/空。从以这种方式打开的导航面板手动选择页面不会在正文区域显示其内容。但是,如果我从桌面手动打开 CHM 文件,它会在正文区域显示所有页面,但从网页启动时仍然失败。

这是我在新 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。非常感谢任何帮助!

【问题讨论】:

    标签: javascript actionscript launch chm externalinterface


    【解决方案1】:

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

    多年前的一系列安全修复已将 HTMLHelp 缩减为仅用作本地帮助。也许这个问题已经得到了不同的解决。

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

    HTML Help 1.x 不具备通过 http 提供压缩帮助的能力。您可以指向用户本地驱动器上的 .chm,也可以链接到 .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 或更高版本,但并非所有浏览器都支持。

    所以,我在同一个本地 D:\_working 文件夹中有一个 test.htm 文件和一个 CHM-example.chm 文件。请注意window.showHelp 在外部应用程序 (Help Viewer 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)产生下面的屏幕截图(请注意第二个浏览器选项卡是第三个按钮的结果)。

    您可能想从我的 HTMLHelp (HH) 信息网站 see download section 下载上面使用的 CHM-example.chm 文件,或直接从 CHM 下载。

    编辑:(在 cmets 之后)

    将此 CHM 文件保存到本地驱动器后的第一步:请检查双击 CHM 文件后内容是否完全显示在右侧的主题窗口中。 p>

    如果没有请注意 - 要打开此 CHM 文件,请右键单击该文件,单击 Properties,然后选中 Unblock 并单击 OK如下图所示:

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

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

    【讨论】:

    • 抱歉延迟回复此问题。感谢您的信息。这三个选项都不适合我,我不知道为什么。我在 D: 驱动器上创建了一个“_working”目录并将您的 CHM 文件放入其中。我还在同一目录中创建了一个测试 HTML 文件,并将您的代码复制/粘贴到其中。
    • @Kevin - 稍后我会从头开始尝试自己的答案。
    • 第一个按钮的行为与我之前的所有测试完全相同:浏览器提示打开或保存文件,然后选择打开会在帮助查看器应用程序中启动 CHM,但不会在正文区域显示内容 -它只显示 CHM 文件的层次结构。其他两个按钮根本不启动 CHM 文件,即使连接的字符串在警告和 IE 检查器中看起来是正确的。
    • FWIW,当我从桌面打开您的 CHM 并导航到 garden.htm 页面时,属性中显示的 URL 是“mk:@MSITStore:D:_working\CHM-example.chm: :/花园/garden.htm”。如果我在 IE 地址栏中键入该页面,则该页面会在 IE 中打开。它还会以您提供的 URL 打开(消除 @MSITStore: 部分)现在我想知道是否有一些特定于我自己的安装的东西。作为记录,我使用的是 HP OMEN 笔记本电脑,HTML 帮助控制版本 10.0,IE for Windows 10 Home v1909
    • @Kevin - 即使在几乎没有安装 Windows 10 Home v1909 和 IE11 的特殊软件的笔记本电脑上,我也能够直接重现我的答案中描述的结果。我添加了一些可能出现故障的想法。请向我的 **Edit ** 提供反馈。你可能已经知道这一切。我完全不清楚 FWIW 中描述的行为。