如何使用 Java 中的锚启动文件协议 URL?

Posted

技术标签:

【中文标题】如何使用 Java 中的锚启动文件协议 URL?【英文标题】:How to launch a file protocol URL with an anchor from Java? 【发布时间】:2010-09-22 23:10:04 【问题描述】:

从 Java 程序中,我需要在本地 html 文件上启动默认浏览器,指向文件内的锚点。在 Java SE 6 中,java.awt.Desktop.browse 方法将打开文件,但不会尊重锚点,因此类似以下内容会在顶部打开文件,但不会将浏览器分页到锚点:

Desktop.getDesktop("file:///C:/foo/bar.html#anchor");

Sun 在这里说 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6477862 文件 URI 协议不支持锚点。

谁有更好的答案?

我可以使用 Java SE 6。我可以使用仅限 Windows 的解决方案。

【问题讨论】:

【参考方案1】:

我只是以另一种方式解决了这个问题,因为这些示例中的任何引用或空格都不适合我。

1 检测文件 URI 是否有锚点或查询字符串

2 如果是这样,请创建一个临时文件 File tmpfile = File.createTempFile("apphelp", ".html"),并将元重定向到我想要的实际文件 URI:

<html><head>
<meta http-equiv="refresh" content="0;url=help.html#set_filter" />
</head></html>

3 使用新的临时 URI 执行本地 rundll 命令:

Runtime.getRuntime().exec(
  "rundll32 url.dll,FileProtocolHandler \"" 
  +tmpfile.toURI().toString()+ "\"");

我希望这对你有用!

【讨论】:

这也适用于Desktop.browse() - 至少在 Windows 上【参考方案2】:

Windows 上的解决方案是:

rundll32 URL.dll, FileProtocolHandler "file:///x:/temp/fragtest.htm#frag"

注意引号!!!

rundll32 URL.dll, FileProtocolHandler file:///x:/temp/fragtest.htm#frag 确实按预期工作。

【讨论】:

【参考方案3】:

仅适用于 Windows,您可以尝试

System.exec("cmd.exe start file:///C:/foo/bar.html#anchor")

【讨论】:

【参考方案4】:

您可以尝试使用BrowserLauncher2。它是一个小型且独立的跨平台库,用于打开默认浏览器。它可以完美地处理锚点。

【讨论】:

在 Windows 7 中对我不起作用,锚已被剥离。我认为这是一个操作系统问题,ProcessMonitor 显示我在没有锚点的情况下对 Firefox 的调用。 虽然这可能是解决问题的宝贵提示,但一个好的答案也可以证明解决方案。请edit 提供示例代码来说明您的意思。或者,请考虑将其写为评论。【参考方案5】:

我已经对此项目 here 进行了一些调查 - 请注意,打开 cmd 并输入 start file:///c:/temp/test.html#anchor 也不起作用。

我认为唯一真正有效的方法是手动调用浏览器(或使用第三方工具)。

在 Windows 上,您始终拥有 Internet Explorer,因此如果您真的不想自己查找 iexplore.exe,可以致电 Runtime.getRuntime().exec("cmd.exe start iexplore " + myURL) - 但这并不总是有效。

【讨论】:

以上是关于如何使用 Java 中的锚启动文件协议 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用js获取修改URL

Javascript/jQuery - 使用正则表达式解析字符串中的主题标签,URL 中的锚点除外

如何判断页面是不是已跳转到 javascript 中的锚点 (#)?

是否将 URL 的锚点部分发送到 Web 服务器?

去掉浏览器中的锚点#号

[我不是网管]分享个ipxegrub2-http协议启动PE的免配置网启模板