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 site,webEngine.executeScript("window")
实际上 return JavaScript Window 对象。还有一大堆其他代码片段值得一看!
在这种情况下,java
是 Window 对象中的 JavaScript 可以使用的处理程序。因此,您的 JavaScript 在引用 java
时可以期望访问 DataModel
对象。
此外,您通常希望在 JavaScript 中使用 location.reload()
刷新页面。
如果您希望在重新加载之间保存状态,您需要捕获当前 HTML,然后在重新加载完成时使用 WebView 的 loadContent functionality。您还可以获取WebView的文档,这样您就可以直接修改任意级别的节点。
我想知道我正在使用的这个代码片段:
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 site,webEngine.executeScript("window")
实际上 return JavaScript Window 对象。还有一大堆其他代码片段值得一看!
java
是 Window 对象中的 JavaScript 可以使用的处理程序。因此,您的 JavaScript 在引用 java
时可以期望访问 DataModel
对象。
此外,您通常希望在 JavaScript 中使用 location.reload()
刷新页面。
如果您希望在重新加载之间保存状态,您需要捕获当前 HTML,然后在重新加载完成时使用 WebView 的 loadContent functionality。您还可以获取WebView的文档,这样您就可以直接修改任意级别的节点。