Ссылочный метод 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, чтобы вы могли напрямую изменять узлы на любом уровне.