在页面加载之前在JavaFX WebView中注入桥接代码?

时间:2014-10-16 09:31:40

标签: webview javafx javafx-2 javafx-8

我想在JavaFX WebView中加载一些内容或页面,并为Java提供一个Bridge对象,以便页面内容可以调用java。

此处描述了如何执行此操作的基本概念:https://blogs.oracle.com/javafx/entry/communicating_between_javascript_and_javafx

现在我的问题是:什么时候将桥接对象注入WebView,以便尽快将其提供。

一个选项是在页面加载之后,如下所述:https://stackoverflow.com/a/17612361/1520422

但是有没有办法尽早注入(在页面内容本身初始化之前),所以在页面加载期间桥接对象可用(而不仅仅是在页面加载之后)?

2 个答案:

答案 0 :(得分:3)

由于没有人回答,我会告诉你我是如何做到这一点的,虽然这很丑陋。这使页面能够在非Java环境中正常运行,但在Java环境中接收Java对象。

我首先向onStatusChanged提供WebEngine处理程序。它会监听window.status的神奇值。如果收到魔术值,则处理程序将安装Java对象。 (在我看来,它更复杂,因为我有一些更复杂的编排:我执行的脚本为页面提供客户端API,然后设置另一个 window.status上的魔术值,使Java对象被发送到客户端API的初始化方法。)

然后在我的目标页面中,我在页面的第一个脚本中有以下代码:

window.status = "MY-MAGIC-VALUE";
window.status = "";

这段代码基本上是"普通"浏览器,但在自定义JavaFX嵌入中运行时会触发初始化。

答案 1 :(得分:-1)

在Java 8中,您可以触发事件从SCHEDULED更改为RUNNING以此时注入对象。在JavaScript运行之前,对象将出现在WebEngine中。 Java 7,我看到状态机在操作上有很大不同,没有为Java 7提供解决方案。

webEngine.getLoadWorker().stateProperty().addListener(
   new ChangeListener<State>(){
   public void changed(ObservableValue<? extends State> ov, 
             State oldState, 
             State newState) 
         {
            // System.out.println("old: "+oldState+", new: "+newState);
             if(newState == State.RUNNING && 
                oldState == State.SCHEDULED){
                 JSObject window = (JSObject)webEngine.executeScript("window");
                 window.setMember("foutput", foutput);
             }
         }
});