【问题标题】:WebView callback from Javascript来自 Javascript 的 WebView 回调
【发布时间】:2013-01-10 14:31:06
【问题描述】:

我尝试基于last example in WebEngine's javadoc 创建一个从 Javascript 回调到 Java 的简单示例(从 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 中引发任何异常。

【问题讨论】:

  • 读者注意:从 2.2.5 开始,桥接类(本例中为 JavaApp)必须声明为 public

标签: webview javafx javafx-2


【解决方案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());
        }
    }
});

【讨论】:

  • 如果加载的页面需要在启动时访问某些应用程序 API,此方法会引入竞争条件,因为页面 JavaScript 在 RUNNING -> SUCCEEDED 转换发生之前执行。
  • 要解决并发访问的经典问题,您可以使用任何标准方法:例如在 js 中等待,直到变量 app 被初始化。
猜你喜欢
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多