Ссылается ли метод executeScript(window) JavaFX8 WebEngine на объект окна 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(); is "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». идентификатор, ссылка, экземпляр, ...?


person Peter    schedule 13.04.2016    source источник


Ответы (1)


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

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

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

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

person Blake Neal    schedule 13.04.2016
comment
Лучший способ описать это состоит в том, что java — это ссылка на экземпляр класса DataModel, который при вызове через JavaScript будет туннелировать через JavaFX для управления экземпляром класса в памяти (таким образом, вызывая предупреждение вместе с указанным вами сообщением). По предоставленной мной ссылке ознакомьтесь с разделом Выполнение вызовов с JavaScript на JavaFX. - person Blake Neal; 13.04.2016