从Javascript的WebView回调(WebView callback from Javasc

2019-07-18 19:01发布

我试图从Javascript创建回调的一个简单的例子,Java的基础上, 在WebEngine的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中webView.getEngine().getLoadWorker().exceptionProperty().addListener(...)

Answer 1:

您正在尝试创建它之前访问的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());
        }
    }
});


文章来源: WebView callback from Javascript