来自 Javascript 的 WebView 回调

标签 webview javafx javafx-2

我尝试创建一个从 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/

相关文章:

java - 错误 : JavaFX runtime components are missing, 并且需要运行此应用程序

java - 媒体 : Play WAV file inside JAR

android - 在 Android 应用程序中打包(自定义)WebView

JavaFX 和 ProgressIndicator 以及 fxml

JavaFX 在控件中显示属性

java - 父阶段在切换到第 3 方窗口并再次切换到应用程序阶段时隐藏

javafx - 我可以将 TextField 放在 javafx 2 上的 TableView 标题列上吗

Android Webview onKeyDown 强制关闭应用

c# - Xamarin - WebView 拉动刷新

具有动态 URL 的 Java android webview