Ссылочный метод JavaFX8 WebEngine executeScript("window") ссылается на объект окна JavaScript?

Мне интересно об этом фрагменте кода, который я использую:

WebView webView = new WebView();
JSObject jsobj;
webEngine = webView.getEngine();
try {
    webEngine.load(getClass().getResource("index.html").toExternalForm());
} catch (Exception e) {
    e.printStackTrace();
}
try {
    jsobj = (JSObject) webEngine.executeScript("window");
    jsobj.setMember("java", new DataModel());
} catch (Exception e) {
    e.printStackTrace()
}

Эта линия webEngine.load(getClass().getResource("index.html").toExternalForm()); загружает мой index.html в WebView, Поскольку это одностраничное приложение, это все, что мне нужно, и больше нет вопросов по этому поводу.

Теперь вернемся к вопросу в заголовке:
Эта строка: jsobj = (JSObject) webEngine.executeScript("window"); установить JSObject ссылка на "объект окна", как он определен w3school?
Означающий, что jsobj теперь равен объекту окна, который представляет открытое окно в браузере?

Если да: может ли это быть причиной того, что мое приложение не будет работать, если я использую "перезагрузить страницу" через контекстное меню в WebView, поскольку он будет генерировать новый window object?

Бонусный вопрос: в моем JavaScript я могу получить доступ к модели, используя java.methodName(); здесь "java" - это идентификатор или как бы я его назвал? Это не совсем случай, поэтому я бы не назвал это так.

Изменить: это мой класс Java:

public class DataModel{
    public void alert(String msg) {
        System.out.println(msg);
    }
}

Из моего JavaScript, который встроен в index.html я могу позвонить java.alert("hello world"); печатать hello world, Поскольку я передаю ссылку на модель window object каждая функция в моем JavaScript имеет доступ к DataModel.class, С точки зрения JavaScript: это "Java". идентификатор, ссылка, экземпляр, ...?

1 ответ

Решение

По данным этого сайта, webEngine.executeScript("window") фактически вернул бы объект Window JavaScript. Есть также куча других вкусностей кода!

java в данном случае это обработчик, который может использоваться вашим JavaScript в объекте Window. Так что ваш JavaScript, при ссылке java можно ожидать доступа к DataModel объект.

Кроме того, вы обычно хотите обновить свою страницу с location.reload() в JavaScript.

Если вы хотите сохранить состояние между перезагрузками, вам нужно захватить текущий HTML, а затем использовать функцию loadContent WebView, когда перезагрузка будет завершена. Вы также можете получить документ WebView, чтобы вы могли напрямую изменять узлы на любом уровне.

Другие вопросы по тегам