我想从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对象从MyController和JavaScript调用函数:
app.hello();
然后,在某个时候,我会像这样更改显示页面:
URL url = getClass().getResource("page2.html");
this.webEngine.load(url.toExternalForm());
问题是,在page2.html中,我不能从MyController调用任何函数。我尝试重新创建对象应用程序(在页面更改之前和之后),但是它不起作用。
如何维护JS和JavaFX内部的交互?
发布于 2016-08-10 02:26:03
我找到了解决办法。加载新页面后,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());
https://stackoverflow.com/questions/38804536
复制