我想在我的HTML上调用javascript中的javafx函数。我做了以下(并且它正常工作):
JSObject win = (JSObject) webEngine.executeScript("window");
win.setMember("app", new MyController(this.webEngine));
URL url = getClass().getResource("page1.html");
this.webEngine.load(url.toExternalForm());
在page1.html中,我可以使用 app 对象通过JavaScript调用 MyController 中的函数:
app.hello();
然后,在某些时刻我改变显示页面如下:
URL url = getClass().getResource("page2.html");
this.webEngine.load(url.toExternalForm());
问题是在page2.html中我无法从 MyController 调用任何函数。我试图重新创建对象应用程序(在页面更改之前和之后),但它不起作用。
如何在JS和JavaFX中维护交互?
答案 0 :(得分:2)
我找到了解决方案。加载新页面后,DOM将被替换,因此window
对象也会更改。在上一页上创建的原始JSObject
对象指向错误的window
,因此JS无法调用其方法。每次重新加载页面时都需要创建一个新的JSObject
对象。
要重新创建新的JSObject
对象,您必须确保页面已完全加载,因此:
webEngine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
if (newState == State.SUCCEEDED) {
JSObject win = (JSObject) webEngine.executeScript("window");
win.setMember("app", new MyController(this.webEngine));
}
});
URL url = getClass().getResource("page2.html");
webEngine.load(url.toExternalForm());