重载后JS和JavaFX之间的通信

时间:2016-08-06 12:58:42

标签: javafx

我想在我的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中维护交互?

1 个答案:

答案 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());