JavaFX8 WebEngine 的 executeScript("window") 方法是否引用了 JavaScript window object?

Does JavaFX8 WebEngine's executeScript("window") method refer to the JavaScript window object?

我想知道我正在使用的这个代码片段:

WebView webView = new WebView();
JSObject jsobj;
webEngine = webView.getEngine();
try {
    webEngine.load(getClass().getResource("index.html").toExternalForm());
} catch (Exception e) {
    e.printStackTrace();
}
try {
    jsobj = (JSObject) webEngine.executeScript("window");
    jsobj.setMember("java", new DataModel());
} catch (Exception e) {
    e.printStackTrace()
}

这一行 webEngine.load(getClass().getResource("index.html").toExternalForm()); 将我的 index.html 加载到 WebView。由于它是一个单页应用程序,这就是我所需要的,没有更多关于它的问题。

现在回到标题中的问题:
此行:jsobj = (JSObject) webEngine.executeScript("window"); 是否将 JSObject 引用设置为 "window object" as it's defined by w3school
意味着 jsobj 现在等于 window object,那代表在浏览器中打开window?

如果是这样:如果我在 WebView 的上下文菜单上使用 "reload page",这是否可能是我的应用程序无法运行的原因,因为它会生成一个新的 window object

奖励问题:在我的 Java 脚本中,我可以使用 java.methodName(); 访问模型,这里是 "java" 标识符 或者我该如何称呼它?它不完全是一个 实例 ,所以我不会这样称呼它。

编辑: 这是我的 Java class:

public class DataModel{
    public void alert(String msg) {
        System.out.println(msg);
    }
}

从我的 Java 脚本中嵌入 index.html 我可以调用 java.alert("hello world"); 来打印 hello world。由于我将模型引用传递给 window object,我的 Java 脚本中的每个函数都可以访问 DataModel.class。从 Java 脚本的角度来看: "java." 是标识符、引用、实例、...?

根据this sitewebEngine.executeScript("window") 实际上 return JavaScript Window 对象。还有一大堆其他代码片段值得一看!

在这种情况下,

java 是 Window 对象中的 JavaScript 可以使用的处理程序。因此,您的 JavaScript 在引用 java 时可以期望访问 DataModel 对象。

此外,您通常希望在 JavaScript 中使用 location.reload() 刷新页面。

如果您希望在重新加载之间保存状态,您需要捕获当前 HTML,然后在重新加载完成时使用 WebView 的 loadContent functionality。您还可以获取WebView的文档,这样您就可以直接修改任意级别的节点。