在页面加载时向WebView注入JS< - > JavaFX bringe

时间:2015-12-26 18:56:55

标签: java javafx webview javafx-8

我需要在JavaScript执行开始之前(或者至少在触发document.onready之前)注入一个桥对象。最常见的解决方案不提供它:

engine.getLoadWorker().getStateProperty().addListener(new ChangeListener<State> {
    @Override
    public void changed(ObservableValue<? extends State> val, State oldV, State newV) {
        if (newV == State.SUCCEEDED) {
            System.out.println("getLoadWorker.stateProperty changed to " + newV + ", injecting an API!");
            ((JSObject) engine.executeScript("window")).setMember("api", new SomeApi());
        }
    }
});

但是一个简单的测试用例表明在状态转换发生之前调用了JavaScipt:

alert("Loaded! typeof(api) == '" + typeof(api) + "'");
$(document).ready(function() {
    alert("Ready! typeof(api) == '" + typeof(api) + "'");
});

此示例输出类似于:

[JS alert] Loaded! typeof(api) == 'undefined'
[JS alert] Ready! typeof(api) == 'undefined'
getLoadWorker.stateProperty changed to SUCCEEDED, injecting an API!

另一个建议的答案(https://stackoverflow.com/a/28414332/1848172)似乎有效,但看起来像一个丑陋的黑客。有没有干净的解决方案?

1 个答案:

答案 0 :(得分:1)

你提到的answer只有在你有权访问页面来源时才有效,因为你必须在那里注入你的魔法状态。

另一种丑陋的方式是基本上加载一个本地HTML页面,这对于你加载内容的iFrame至关重要。这样您就可以将javascript注入本地加载的页面,然后通过JavaScript加载实际页面。但这完全取决于您要执行的JavaScript。