【问题标题】:Call JavaScript function from JavaFX before loading在加载之前从 JavaFX 调用 JavaScript 函数
【发布时间】:2021-05-15 17:44:45
【问题描述】:

在实际加载 html 文件之前,我需要从 JavaFX WebEngine 初始化 JavaScript 中的一些变量。我的 .html 文件如下所示:

<!DOCTYPE html>
<html>
<head>
    <script type='text/javascript'>
        var a;
        function setA(aa) {
            a = aa;
        }
        function f() {
            <!-- ... some operation with var a-->
        }
    </script>
</head>
<body onload='f();'>
    <!-- ... -->
</body>
</html>

对于 JavaFX 部分:

 @Override
    public void start(Stage primaryStage) throws InterruptedException {
        WebView webview = new WebView();
        WebEngine webengine=webview.getEngine();

        // Set var a before webengine.load
        webengine.load(getClass().getResource("hello.html").toString());

        Pane p = new Pane();
        p.getChildren().add(webview);
        Scene scene = new Scene(p);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

我试过不放 onload='f();'在.html的body标签中,然后我尝试像这样从Java中一一调用JavaScript函数:

webengine.load(getClass().getResource("hello.html").toString());
webengine.executeScript("setA(123)");
webengine.executeScript("f()");

但这不起作用(我得到 ReferenceError: Can't find variable setA/f )。

任何潜在的解决方案?

【问题讨论】:

  • 你的目标到底是什么?据我了解,您需要在加载 html 之前初始化一些状态。您可以做的是首先使用模板库(如 Freemarker)生成 html 文件。这样您可以预先设置状态,然后在 JavaFX 中加载(现在是有状态的)生成的 html 文件。
  • 我其实想过做类似的事情,但我认为有更简单的方法。确切地说,我正在使用 Bing Maps JavaScript API,并且我想加载以我在执行 JavaFX 程序期间获得的一些坐标为中心的地图。我有使用预定义坐标加载地图的 JavaScript 函数,我需要在页面加载之前设置这些坐标。我基本上没有使用 JavaScript 的经验,所以如果我的问题在任何方面都不够充分,我很抱歉。感谢您的回复@BillTsagkas
  • webengine.load() 方法之后是否立即执行脚本?您是否尝试在页面加载后执行它们? (通过在webengine 的负载工作人员上使用ChangeListener) - 检查文档中的example。我尝试通过执行页面 load 上的脚本来执行您的代码。所需的结果显示在页面 render 上。您可以尝试一下并返回结果吗?
  • 我之前尝试过这种方法,但没有成功(天知道是什么原因),但我现在又试了一次,效果很好。非常感谢@BillTsagkas!

标签: javascript javafx javafx-webengine


【解决方案1】:

所以你想在“浏览器”开始处理 html 内容之前执行一些 js 的东西...

简短的回答......你真的不能这样做。

长答案...您实际上可以这样做,但是您需要使用 jdk 的本地修改版本,在其中修改隐藏的组件,例如 WebPage 这是 WebEngine 使用的组件...或使用绕过运行时访问策略的反射......但即便如此,它也会打开一罐蠕虫,你无法保证它会按照你期望的方式工作。

【讨论】:

    猜你喜欢
    • 2014-05-04
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多