我需要在 JavaScript 执行开始之前(或者至少在触发 document.onready
之前)注入(inject)一个桥接对象。最常见的解决方案不提供它:
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 )似乎有效,但看起来像一个丑陋的黑客。有没有干净的解决方案?
最佳答案
answer您提到的只有在您有权访问页面源代码时才有效,因为您必须在那里注入(inject)魔法状态。
另一种丑陋的方法是基本上加载本地 HTML 页面,这是一个重要的 iFrame,然后您可以将内容加载到其中。这样您就可以将 JavaScript 注入(inject)到本地加载的页面中,然后通过 JavaScript 加载实际页面。然而,这完全取决于您想要执行的 JavaScript。
关于java - 在页面加载时将 JS<->JavaFX Bringe 注入(inject)到 WebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34474263/