通过 JavaScript 打开 CHM 帮助文件到特定页面
Open CHM help file to a specific page via JavaScript
这里有很多关于这个主题的帖子,但是 none 是从网页启动 CHM 帮助文件的解决方案。
背景:
- 这个项目不在 Internet 上,它是一个 运行 在本地医疗设备 运行 上使用 IE11 的网站。
- 它之前被编码为一个 Flash ActionScript web 应用程序,并成功地使用了 ActionScript 的 ExternalInterface.call("callJavascript", variableStr );打开 CHM 文件。不幸的是,该项目需要移植到 HTML5,我还没有找到有效的 JavaScript 解决方案。
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 页面中调用类似函数时,将完整的 CHM 路径和页面连接在一起并将其传递给启动函数时,我收到 404 错误“找不到项目”。
- 如果我离开页面而只使用 CHM 文件的路径,浏览器会提示“打开或保存”文件。当我选择“打开”时,CHM 文件在 Microsoft HTML Help Control Version 10.0 中启动到堆栈中的第一页,但仅显示页面的导航面板,正文区域为 blank/empty。从以这种方式打开的导航面板中手动选择页面不会在正文区域显示其内容。但是,如果我从桌面手动打开 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。非常感谢任何帮助!
简短的故事 - 查看 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 秒后自动消失。
这里有很多关于这个主题的帖子,但是 none 是从网页启动 CHM 帮助文件的解决方案。
背景:
- 这个项目不在 Internet 上,它是一个 运行 在本地医疗设备 运行 上使用 IE11 的网站。
- 它之前被编码为一个 Flash ActionScript web 应用程序,并成功地使用了 ActionScript 的 ExternalInterface.call("callJavascript", variableStr );打开 CHM 文件。不幸的是,该项目需要移植到 HTML5,我还没有找到有效的 JavaScript 解决方案。
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 页面中调用类似函数时,将完整的 CHM 路径和页面连接在一起并将其传递给启动函数时,我收到 404 错误“找不到项目”。
- 如果我离开页面而只使用 CHM 文件的路径,浏览器会提示“打开或保存”文件。当我选择“打开”时,CHM 文件在 Microsoft HTML Help Control Version 10.0 中启动到堆栈中的第一页,但仅显示页面的导航面板,正文区域为 blank/empty。从以这种方式打开的导航面板中手动选择页面不会在正文区域显示其内容。但是,如果我从桌面手动打开 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。非常感谢任何帮助!
简短的故事 - 查看 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 秒后自动消失。