【问题标题】:Inject a JS<->JavaFX bringe to WebView on page load在页面加载时将 JS<->JavaFX 引入 WebView
【发布时间】: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


    【解决方案1】:

    您提到的answer 仅在您可以访问页面源时才有效,因为您必须在那里注入您的魔法状态。

    另一种丑陋的方式是加载一个本地 HTML 页面,这是一个必不可少的 iFrame,然后您可以在其中加载内容。这样您就可以将您的 javascript 注入本地加载的页面,然后通过 JavaScript 加载实际页面。但是,这一切都取决于您要执行的 JavaScript。

    【讨论】:

      猜你喜欢
      • 2019-02-13
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多