我尝试创建一个从 Javascript 到 Java 的回调的简单示例,基于 last example in WebEngine's javadoc (从 JavaScript 回调 Java)。但是当我单击 WebView 中的链接时,不会调用 Java 方法并且页面消失。
public class TestOnClick extends Application {
@Override
public void start(Stage stage) throws Exception {
try {
final WebView webView = new WebView();
final WebEngine webEngine = webView.getEngine();
Scene scene = new Scene(webView);
stage.setScene(scene);
stage.setWidth(1200);
stage.setHeight(600);
stage.show();
String webPage = "<html>\n"
+ " <body>\n"
+ " <a href=\"\" onclick=\"app.onClick()\">Click here</a>\n"
+ " </body>\n"
+ "</html>";
System.out.println(webPage);
webView.getEngine().loadContent(webPage);
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("app", new JavaApp());
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
public static class JavaApp {
public void onClick() {
System.out.println("Clicked");
}
}
}
注意:使用 webView.getEngine().getLoadWorker().exceptionProperty().addListener(...) 监视负载工作线程时,我没有看到 WebView 中抛出任何异常
.
最佳答案
您正在尝试在创建 webview DOM 模型之前访问它。
将您的 JavaApp
相关代码包装到页面加载监听器以实现您的目标:
webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
@Override
public void changed(ObservableValue<? extends State> ov, State t, State t1) {
if (t1 == Worker.State.SUCCEEDED) {
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("app", new JavaApp());
}
}
});
关于来自 Javascript 的 WebView 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14541933/