gpt4 book ai didi

html - JavaFX WebView : link to anchor in document doesn't work using loadContent()

转载 作者:行者123 更新时间:2023-11-27 23:06:08 28 4
gpt4 key购买 nike

注意:这是关于 JavaFX WebView,而不是 Android WebView(即我已经看到“Android Webview Anchor Link (Jump link) not working”)。


我在 javafx.scene.web.WebView 中显示生成的 HTML 页面包含 anchor 和指向这些 anchor 的链接,如下所示:

<p>Jump to <a href="#introduction">Introduction</a></p>
some text ...
<h1 id="introduction">Introduction</h1>
more text ...

我使用这段代码将 HTML 加载到 WebView 中:

public void go(String location) {
try {
// read the content into a String ...
String html = NetUtil.readContent(new URL(location), StandardCharsets.UTF_8);
// ... and use loadContent()
webview.getEngine().loadContent(html);
} catch (IOException e) {
LOG.error(e);
}
}

一切都正确呈现,但如果我单击名为“Introduction”的链接,则没有任何反应。

但是 HTML 是正确的,我使用以下代码进行了检查:

public void go(String location) {
// use load() to directly load the URL
webview.getEngine().load(location);
}

现在,一切正常。

问题似乎是因为使用loadContent()时WebView的文档URL为null,但由于它是一个只读属性,我不知道如何使其发挥作用。

我需要使用 loadContent(),因为 HTML 是动态生成的,如果可能的话,我不想将它写到一个文件中使 anchor 链接工作。有办法解决这个问题吗?


编辑我提交了 bug用于 JavaFX。

最佳答案

这可能是另一个网络引擎错误。很多代码只是包装在 api 中的 native 库,因此我们无法在运行时修改它来修复某些缺陷。

如果您能够更改生成文件的结构,您可以在 js 中实现滚动到元素:

<script>
function scrollTo(elementId) {
document.getElementById(elementId).scrollIntoView();
}
</script>

<a href='#' onclick=scrollTo('CX')>Jump to Chapter X</a>
<h2 id="CX">Chapter X</h2>

如果你不能改变结构,我已经做了一些尝试修复它的步骤和一些建议 - 首先我通过反射设置了 location 的值 loadContent 确定:

Field locationField = WebEngine.class.getDeclaredField("location");
locationField.setAccessible(true);

ReadOnlyStringWrapper location = (ReadOnlyStringWrapper) locationField.get(engine);
location.set("local");

但事实上,保持实际位置的状态只是给你的一个信息,操纵它不会改变任何东西。我还找到了一种从 js 设置 url 的方法(只是一个远景,我们没有任何具体细节为什么它不起作用):

window.history.pushState("generated", "generated", '/generated');

当然我们不能因为:

SecurityError: DOM Exception 18: An attempt was made to break through the security policy of the user agent.

我认为您应该忘记 loadContent()。您说您不想将生成的内容写入文件。一个小肮脏的 hack 但对您确实有帮助,可以将 http 服务器包装在应用程序中随机且未使用的端口上。您甚至不需要外部库,因为 Java 具有类似这样的简单实用程序:

HttpServer server = HttpServer.create(new InetSocketAddress(25000), 0);
server.createContext("/generated", httpExchange -> {
String content = getContent();
httpExchange.sendResponseHeaders(200, content.length());
OutputStream os = httpExchange.getResponseBody();
os.write(content.getBytes());
os.close();
});

server.setExecutor(null);
server.start();

您也可以使用其他浏览器来显示您的页面,例如JCEF (Java Chromium 嵌入式框架)。

关于html - JavaFX WebView : link to anchor in document doesn't work using loadContent(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49070734/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com