gpt4 book ai didi

java - 从 angularjs 调用 java 只在手动页面刷新后才有效

转载 作者:行者123 更新时间:2023-11-30 08:31:12 25 4
gpt4 key购买 nike

我在 javafx webview 组件中使用 angularjs 来构建一个小型应用程序。

我在更改监听器中使用此代码附加 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)方法。该类本身是一个公共(public)类。

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 方法时,我收到以下错误消息:

2016 年 11 月 24 日上午 10:50:12 be.azSTLucas.cpr.view.Browser$1 条消息已添加

信息:java 存在对象{}

2016 年 11 月 24 日上午 10:50:12 be.azSTLucas.cpr.view.Browser$1 条消息已添加

信息:starttest 不存在

2016 年 11 月 24 日上午 10:50:12 be.azSTLucas.cpr.view.Browser$1 条消息已添加

信息:错误:undefined 不是函数(正在评估“window.javabridge.starttest()”)

但是,如果我使用 web View 中的右键单击选项重新加载页面并重新运行该方法,那么由于某种原因该方法确实存在并且可以毫无问题地执行。

有谁知道是什么原因造成的?

最佳答案

更改这些代码行解决了我的问题。

log.log(Level.INFO, "initializing javascript");
JSObject window = (JSObject) engine.executeScript("window");
window.setMember("javabridge", new JavaScriptBridge());

我已将 JavaScriptBridge 设为执行此代码的类的私有(private)最终成员。

关于java - 从 angularjs 调用 java 只在手动页面刷新后才有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40783064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com