java - 在页面加载时将 JS<->JavaFX Bringe 注入(inject)到 WebView

标签 java javafx webview javafx-8

我需要在 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/

相关文章:

Java Stream : how to pass Set to Stream. of() 并在每个元素上调用方法?

java - @Cachable 注解不起作用

javascript - JavaFX Webview 不支持 window.FileReader javascript 的解决方法

观察者和 getstyleclass() 监听器之间的 Javafx 冲突

java - 如何从 menu.xml 打开到 WebView 的链接

java - 更改特定 JTable 单元格中的数据

java - 使用默认模板的 spring mvc 出现 404 错误

javafx - 如何在javafx 2.1中将节点转换为图像?

android - WebView 和 HTML5 <视频>

WebView 中的 JavaScript - Android Studio