在页面加载之前在JavaFXWebView中插入桥接代码?
我想在JavaFXWebView中加载一些内容或页面,并向Java提供一个桥接对象,以便页面内容可以调用Java 这里描述了如何进行此操作的基本概念: 现在我的问题是:什么时候将bridge对象注入WebView以便它尽快可用 一个选项是页面加载后,如下所述:在页面加载之前在JavaFXWebView中插入桥接代码?,webview,javafx,javafx-2,javafx-8,Webview,Javafx,Javafx 2,Javafx 8,我想在JavaFXWebView中加载一些内容或页面,并向Java提供一个桥接对象,以便页面内容可以调用Java 这里描述了如何进行此操作的基本概念: 现在我的问题是:什么时候将bridge对象注入WebView以便它尽快可用 一个选项是页面加载后,如下所述: 但是有没有一种方法可以更快地(在页面内容本身初始化之前)注入它,从而使桥接对象在页面加载期间可用(而不仅仅是在页面加载之后)?由于没有人回答,我将告诉您我是如何做的,尽管它很难看。这使页面能够在非Java环境中正常工作,但在Java环境中
但是有没有一种方法可以更快地(在页面内容本身初始化之前)注入它,从而使桥接对象在页面加载期间可用(而不仅仅是在页面加载之后)?由于没有人回答,我将告诉您我是如何做的,尽管它很难看。这使页面能够在非Java环境中正常工作,但在Java环境中接收Java对象 我首先向
WebEngine
提供一个onStatusChanged
处理程序。它将侦听窗口的神奇值。状态
。如果收到magic值,处理程序将安装Java对象。(在我的例子中,它更复杂,因为我有一些更复杂的编排:我正在执行一个脚本,为页面提供客户端API,然后在window.status
上设置另一个神奇的值,以使Java对象发送到客户端API的初始化方法)
然后在我的目标页面中,我在页面的第一个脚本中有以下代码:
window.status = "MY-MAGIC-VALUE";
window.status = "";
此代码在“普通”浏览器中基本上是无操作的,但在自定义JavaFX嵌入中运行时会触发初始化。在Java 8中,您可以触发事件从计划更改为运行,以在此时插入对象。这些对象将在运行JavaScript之前出现在WebEngine中。Java7,我看到状态机在操作上有很大的不同,没有为Java7提供解决方案
webEngine.getLoadWorker().stateProperty().addListener(
new ChangeListener<State>(){
public void changed(ObservableValue<? extends State> ov,
State oldState,
State newState)
{
// System.out.println("old: "+oldState+", new: "+newState);
if(newState == State.RUNNING &&
oldState == State.SCHEDULED){
JSObject window = (JSObject)webEngine.executeScript("window");
window.setMember("foutput", foutput);
}
}
});
webEngine.getLoadWorker().stateProperty().addListener(
新的ChangeListener(){
我已经自己找到了这个解决方案。无论如何,谢谢。我希望有一个更像是为这个目的设计的东西……但我还是接受了你的解决方案。