【问题标题】:call a java method from javascript in javafx从 javafx 中的 javascript 调用 java 方法
【发布时间】:2018-08-23 06:33:22
【问题描述】:

我有一个 javafx 应用程序。最初它使用 WebView 加载登录页面。登录页面采用用户名并重定向到另一个页面。在这个 html 页面中,我在 javascript 中有一个函数。我想在执行脚本时调用 java 方法。但我最终得到一个错误说

ReferenceError: Can't find variable: OpenDoc[at 17]

这是我的html

html>

    <body onload="login()">
        <div id="jnlpStart_EN">
            <H2>Welcome to Home Page</H2>
        </div>
    </body>

    <script type="text/javascript">
        function login() {
            OpenDoc.passDocId('q56wre');
        }
    </script>

</html>

这是我的java代码

public class WebEngineTest1 extends Application {

    @Override
    public void start(Stage primaryStage) {
        WebConsoleListener.setDefaultListener((webView, message, lineNumber, sourceId) -> {
            System.out.println(message + "[at " + lineNumber + "]");
        });

        WebView webView = new WebView();
        WebEngine engine = webView.getEngine();

        engine.load("http://localhost:8001/app/login");
        engine.locationProperty().addListener((obs, oldLocation, newLocation) -> {
            if (newLocation != null && newLocation.endsWith("/home")) {
                JSObject window = (JSObject) engine.executeScript("window");
                window.setMember("OpenDoc", new OpenDoc());
            }
        });
        Scene scene = new Scene(webView, 300, 150);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }

    public class OpenDoc {
        public void passDocId(String id) {
            System.out.println(id);
        }
    }
}

【问题讨论】:

  • 您是否仔细检查过您的if-statement 是否正在运行?

标签: javafx webview webengine


【解决方案1】:

我找到了答案。 由于登录后它会重定向到一个 URL。我不得不用 documentProperty() 添加一个监听器。在里面我添加了从 javascript 调用 java 方法的代码。因此,在加载页面时,我没有收到 ReferenceError: Can't find variable: OpenDoc[at 17] 消息,因为我已经添加了参考。这是代码

engine.documentProperty().addListener((v, o, n) -> {
            String newLocation = webEngine.getLocation();
            if (newLocation != null && newLocation.endsWith("/home")) { 
                JSObject window = (JSObject) engine.executeScript("window");
                        window.setMember("OpenDoc", new OpenDoc());
            }           
        });

【讨论】:

    【解决方案2】:

    首先你必须在WebEngine上启用JavaScript

    webEngine.setJavaScriptEnabled(true);
    

    这条线可以解决问题

    webengine.executeScript("initOpenDoc(\"ID\")");
    

    【讨论】:

    • 你不能只调用一个为你初始化OpenDoc对象的函数吗?查看我编辑的答案
    • 运气不好。
    猜你喜欢
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多