2015-12-26 52 views
0

我需要在JavaScript执行开始之前(或至少在触发document.onready之前)注入一个桥对象。最常见的解决方案并没有提供它:在页面加载时注入JS <-> JavaFX bringe到WebView

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) + "'"); 
}); 

此示例。OUPUTS类似:

[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)似乎工作,但看起来像一个丑陋的黑客。有没有干净的解决方案?

回答

1

您提到的answer只适用于您有权访问页面源的情况,因为您必须在那里注入魔术状态。

另一个丑陋的方式是基本上加载一个本地HTML页面,这是一个重要的iFrame,然后您将加载内容。这样,您可能可以将JavaScript注入本地加载的页面,然后通过JavaScript加载实际页面。但是,这一切都取决于您要执行的JavaScript。

相关问题