页面加载前注入桥码JavaFX中的WebView?(Inject bridge-code in Ja

2019-10-21 03:53发布

我想加载一个JavaFX的WebView一些内容或页面,并提供一个桥梁对象到Java所以页面的内容可以做电话到Java。

如何做到这一点的基本概念描述如下: https://blogs.oracle.com/javafx/entry/communicating_between_javascript_and_javafx

现在我的问题是:当是一个好时机注入桥对象到的WebView所以它是可以尽快。

这里所描述的一种选择是页面加载后: https://stackoverflow.com/a/17612361/1520422

但是,有没有办法来注入这个越早(页面之前内容本身进行初始化),所以桥对象可在页加载(而不是仅在页面加载)?

Answer 1:

由于没有人回答,我会告诉你我是如何做的,尽管它是丑陋的。 这为网页正常运行在非Java环境但在Java环境中收到的Java对象的能力。

我通过提供启动onStatusChanged处理器的WebEngine 。 它侦听的魔法值window.status 。 如果接收到魔法值,处理程序安装Java对象。 (对我来说,这是比较复杂的,因为我有一些更复杂的业务流程:我在执行一个脚本,提供该页面的客户端API,然后设置另一个魔法值window.status使Java对象是发送到客户端侧API的初始化方法)。

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

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

这段代码基本上是一个无操作在一个“正常”的浏览器,但触发初始化自定义JavaFX的嵌入运行时。



Answer 2:

在Java 8中,您可以触发事件改变从预定RUNNING此时注入对象。 对象将呈现WebEngine的JavaScript运行之前。 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);
             }
         }
});


文章来源: Inject bridge-code in JavaFX WebView before page-load?