我已经尝试过简化代码:
WebEngine webEngine = browser.getEngine(); webEngine.getLoadWorker().stateProperty().addListener((ov,oldState,newState)->{ if(newState==State.SUCCEEDED){ JSObject window = (JSObject) webEngine.executescript("window"); window.setMember("app", new JavaApplication()); } }); webView.getEngine().loadContent("<html>n" + " <script>function initialize() {" + " var lengthInMeters = 5; " + " app.calljavascript(lengthInMeters);" + "} </script> " + " <body onLoad="initialize()">Hi!n" + " </body>n" + "</html>");而且不起作用。
在您的情况下和在我的方法中,
setMember()是 在* 网络加载 后 调用的,因此在方法
之前
initialize()被调用。因此,失败。 *
load``app.calljavascript()
解决方案是这样的:
WebEngine webEngine = browser.getEngine(); JSObject window = (JSObject) webEngine.executescript("window"); window.setMember("app", new JavaApplication()); browser.getEngine().loadContent("<html>n" + " <script>function initialize() {" + " var lengthInMeters = 5; " + " app.calljavascript(lengthInMeters);" + "} </script> " + " <body onLoad="initialize()">Hi!n" + " </body>n" + "</html>");注意,我们 在 加载Web内容 之前 设置了成员。
编辑
我在这里创建了一个更详细的答案。



