2016-04-13 2 views
2

Я интересно об этом фрагменте кода я использую:Использует ли метод сценария 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 ссылку на "window object" as it's defined by w3school?
Значение jsobj теперь равно окну, то представляет собой открытое окно в браузере?

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

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

Edit: Это мой 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». идентификатор, ссылка, экземпляр, ...?

ответ

3

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

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

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

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

+0

Отредактировано оригинальное сообщение, спасибо за помощь! :) –

+0

Лучший способ описать это, что java является ссылкой на экземпляр класса DataModel, который при вызове через JavaScript будет туннелировать через JavaFX, чтобы манипулировать экземпляром класса в памяти (тем самым вызывая предупреждение вместе с указанным вами msg). Со ссылкой, которую я предоставил, ознакомьтесь с разделом «Создание ссылок с JavaScript на JavaFX». –

+0

Это отвечает на все, что я просил, спасибо –