JavaFX:当从webEngine调用load()时,将DOM传递给Javascript

JavaFX: pass in DOM to Javascript when load() is called from the webEngine

本文关键字:DOM Javascript 当从 webEngine 调用 load JavaFX      更新时间:2023-09-26

我一直在尝试传递我创建的一个变量,以便在JavaFX中加载WebView时指定要连接到哪个服务器。我的应用程序的设置方式是,它基本上是在模仿JavaFX中的网页。它创建一个Scene,将其设置为Stage并调用show()。Initialize将被覆盖,并创建一个URL,该URL表示HTML文件的文件路径。然后在此URL上调用load()。有什么方法可以让Javascript在load()时从JavaFX了解变量吗?

例如:

public class MyClass implements Initializable
{
  @FXML
  private WebView wWeb;
  private String server = "xyz:server";
  @Override
  public void initialize(URL url, Resource rb)
  {
    URL urlContent = getClass().getResource("index.html");
    wWeb.getEngine().load( urlContent.toExternalForm() );
  }
}

我尝试在.html之后添加"?server=" + server来添加服务器,但JavaFX认为整个String就是文件名,找不到具有该确切名称的文件。在加载时将DOM从Java传递到Javascript应该没有那么困难。任何帮助都会很棒。我一直在寻找解决方案,已经读了很多S.O.的页面,但都没有解决这个问题。

已解决:

好吧,孩子们。。。找到了一种加载页面然后在Javascript中设置变量的方法。解锁的关键是在Javascript中加载后将window.status设置为等于某个值,然后在JavaFX中添加一个侦听器来处理状态的更改。当这种状态改变时,我现在可以调用executeScript()。我不得不在我的Javascript中编写一个名为setServerFromJava()的函数。我在测试代码中留下来帮助其他人了解发生了什么以及何时发生。

JavaFX:

public class MyClass implements Initializable
{
  @FXML
  private WebView wWeb;
  private String server = "xyz:server";
  @Override
  public void initialize(URL url, Resource rb)
  {
    URL urlContent = getClass().getResource("index.html");
    wWeb.getEngine().load( urlContent.toExternalForm() );
    //I am looking for a change of status so I can inject the DOM
    wWeb.getEngine().setOnStatusChanged(new EventHandler<WebEvent<String>>()
    {
      public void handle(WebEvent<String> status)
      {
        String s = status.getData();
        if(s != null && s.equals( "done" ))
        {
          // the dom is loaded and ready to go
          System.out.println("DID I GET HERE?");
          // javascript
          wWeb.getEngine().executeScript("setServerFromJava('"+ server + "');");
        }
        System.out.println(status);
      }
    });
  }
}

Javascript:

window.addEventListener("load", function(e)
{
  //DO STUFF HERE...
  //MORE STUFF...
  window.status = "done";
});