我需要在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)似乎有效,但看起来像一个丑陋的黑客。有没有干净的解决方案?
答案 0 :(得分:1)
你提到的answer只有在你有权访问页面来源时才有效,因为你必须在那里注入你的魔法状态。
另一种丑陋的方式是基本上加载一个本地HTML页面,这对于你加载内容的iFrame至关重要。这样您就可以将javascript注入本地加载的页面,然后通过JavaScript加载实际页面。但这完全取决于您要执行的JavaScript。