JavaFX WebEngine设置文档位置

时间:2019-05-17 22:02:47

标签: java javafx webview

我正在手动向网站发送请求,并在/** * Increase the click area of this view */ fun View.increaseHitArea(dp: Float) { // increase the hit area val increasedArea = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, Resources.getSystem().displayMetrics).toInt() val parent = parent as View parent.post { val rect = Rect() getHitRect(rect) rect.top -= increasedArea rect.left -= increasedArea rect.bottom += increasedArea rect.right += increasedArea parent.touchDelegate = TouchDelegate(rect, this) } } 中呈现响应的正文。为此,我使用了WebView引擎的WebView方法:

loadContent

这个问题是String bodyOfResponse = ...; myWebView.getEngine().loadContent(bodyOfResponse); 的内容来自WebView,而不是位置,因此它不知道如何解析我给它的内容的HTML中的相对链接:

String

<span onclick="document.location.href='/'">Home</span> 找不到WebView所指的内容,因为我没有通过URL提供'/'内容。有没有一种方法可以设置当前文档的位置(或我曾听说过的baseURI),以便我的WebView知道如何解析相对路径? (我知道原始服务器的URL。)

我已经看到,在内容中使用绝对位置,而不是相对位置,足以使WebView在该位置加载数据,但是我无法修改服务器并拥有它在所有HTML页面中为我提供绝对URL。

如果我能WebView ...那太好了,但我做不到。 :(

1 个答案:

答案 0 :(得分:1)

等待WebEngine的Document完成加载,然后在<head>内添加一个<base>元素:

String newBaseURL = "http://www.example.com/app";

myWebView.getEngine().getLoadWorker().stateProperty().addListener(
    (obs, old, state) -> {
        if (state == Worker.State.SUCCEEDED) {
            Document doc = myWebView.getEngine().getDocument();

            XPath xpath = XPathFactory.newInstance().newXPath();
            try {
                Element base = (Element) xpath.evaluate(
                    "//*[local-name()='head']/*[local-name()='base']",
                    doc, XPathConstants.NODE);

                if (base == null) {

                    Element head = (Element) xpath.evaluate(
                        "//*[local-name()='head']",
                        doc, XPathConstants.NODE);

                    if (head == null) {
                        head = doc.createElement("head");

                        Element html = (Element) xpath.evaluate(
                            "//*[local-name()='html']",
                            doc, XPathConstants.NODE);
                        html.insertBefore(head, html.getFirstChild());
                    }

                    base = doc.createElement("base");
                    head.insertBefore(base, head.getFirstChild());
                }

                base.setAttribute("href", newBaseURL);

            } catch (XPathException e) {
                e.printStackTrace();
            }
        }
    });
myWebView.getEngine().loadContent(bodyOfResponse);