【发布时间】:2015-12-26 18:56:54
【问题描述】:
我需要在 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) 似乎有效,但看起来像一个丑陋的黑客。有什么干净的解决方案吗?
【问题讨论】:
标签: java javafx webview javafx-8