我在javafx webview组件中使用angularjs来构建一个小应用程序。
我在changelistener中使用此代码附加了javascript桥对象。
private void initJavaScriptBrige(){
log.log(Level.INFO, "initializing javascript");
JSObject window = (JSObject) engine.executeScript("window");
window.setMember("javabridge", new JavaScriptBridge());
}
engine.getLoadWorker().stateProperty().addListener(
new ChangeListener<State>() {
@Override public void changed(ObservableValue ov, State oldState, State newState) {
log.log(Level.INFO, "State chaged to {0} for page {1}", new Object[]{newState.name(), engine.getLocation()});
if(newState.equals(State.SUCCEEDED)){
initJavaScriptBrige();
//check is the bridge exists
JSObject window = (JSObject) engine.executeScript("window");
Object java=window.getMember("javabridge");
log.log(Level.INFO, "java {0}", new Object[]{java==null?"does not exist":"exists"});
}
}
}
);
JavaScriptBridge类有一个名为starttest的公共方法。班级本身就是公共班级。
public class JavaScriptBridge {
private Logger log = Logger.getLogger(JavaScriptBridge.class.getName());
public String val="test";
public JavaScriptBridge() {
log.log(Level.INFO, "Bridge was created");
}
public void starttest(){
log.log(Level.INFO, "starting test");
}
}
在javascript(angularjs)中,我使用此代码执行命令。
startTest(){
if(window.javabridge){
console.log("java exists "+(typeof window.javabridge)+" "+JSON.stringify(window.javabridge));
if(window.javabridge.starttest){
console.log("starttest exists");
window.javabridge.starttest();
}else{
console.log("starttest does not exist");
window.javabridge.starttest();
}
}else{
console.log("java does not exist");
}
}
当我执行starttest javascript方法时,我收到以下错误消息:
nov 24,2016 10:50:12 AM be.azstlucas.cpr.view.Browser $ 1 messageAdded
INFO:java exists object {}
nov 24,2016 10:50:12 AM be.azstlucas.cpr.view.Browser $ 1 messageAdded
INFO:starttest不存在
nov 24,2016 10:50:12 AM be.azstlucas.cpr.view.Browser $ 1 messageAdded
INFO:错误:undefined不是函数(评估'window.javabridge.starttest()')
但是,如果我使用webview中的右键单击选项重新加载页面并重新运行该方法,那么由于某种原因,该方法确实存在并且执行没有任何问题。
有谁知道可能导致这种情况的原因?
答案 0 :(得分:2)
更改这些代码行解决了我的问题。
log.log(Level.INFO, "initializing javascript");
JSObject window = (JSObject) engine.executeScript("window");
window.setMember("javabridge", new JavaScriptBridge());
我已经使JavaScriptBridge成为执行此代码的类的私有最终成员。