来自 Javascript 的 WebView 回调 [英] WebView callback from Javascript

查看:27
本文介绍了来自 Javascript 的 WebView 回调的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试基于 WebEngine 的 javadoc 中的最后一个示例(从 JavaScript 回调到 Java).但是当我点击WebView中的链接时,没有调用Java方法,页面消失.

I tried to create a simple example of callback from Javascript to Java, based on the last example in WebEngine's javadoc (Calling back to Java from JavaScript). But when I click the link in the WebView, the Java method is not called and the page disappears.

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>
"
                    + "    <body>
"
                    + "        <a href="" onclick="app.onClick()">Click here</a>
"
                    + "    </body>
"
                    + "</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 中抛出任何异常.

Note: I don't see any exceptions being thrown in the WebView when monitoring the load worker with webView.getEngine().getLoadWorker().exceptionProperty().addListener(...).

推荐答案

您正在尝试在创建 webview DOM 模型之前访问它.

You are trying to access webview DOM model before it was created.

将您的 JavaApp 相关代码包装到页面加载侦听器中以实现您的目标:

Wrap your JavaApp related code to the page load listener to achieve your goal:

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 回调的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆