JavaFX WebEngine устанавливает местоположение документа - PullRequest
0 голосов
/ 18 мая 2019

Я отправляю запрос на веб-сайт вручную и отображаю тело ответа в WebView.Для этого я использовал loadContent метод движка WebView:

String bodyOfResponse = ...;
myWebView.getEngine().loadContent(bodyOfResponse);

Проблема в том, что WebView получает свое содержимое от String, а не отlocation, поэтому он не знает, как разрешить относительные ссылки в HTML содержимого, которое я ему предоставляю:

<span onclick="document.location.href='/'">Home</span>

WebView не может найти то, к чему относится '/', так как я не сделал 'передать содержимое WebView через URL.Есть ли способ, которым я могу установить местоположение текущего документа (или baseURI, я слышал, что он называется), чтобы мой WebView знал, как разрешить относительные пути?(Я знаю URL исходного сервера.)

Я видел, что использование абсолютного расположения в контенте, а не относительного, достаточно, чтобы получить WebView для загрузки данных в этом месте,но я не могу изменить сервер, чтобы он служил мне абсолютными URL-адресами на всех страницах HTML.

Было бы замечательно, если бы я мог просто webEngine.setBasePath(serverURL) ... но я не могу.(

1 Ответ

1 голос
/ 18 мая 2019

Подождите, пока Документ WebEngine завершит загрузку, затем добавьте элемент внутри <head>:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...