JavaFX8 WebEngine的executeScript(“window”)方法是否引用JavaScript窗口对象?

时间:2016-04-13 13:11:22

标签: javascript java javafx webview jsobject

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

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现在等于窗口对象,表示在浏览器中打开窗口

如果是这样的话:如果我在WebView的上下文菜单中使用“重新加载页面”,这可能是我的应用程序无效的原因,因为它会生成新的window object吗?

奖金问题:在我的JavaScript中,我可以使用java.methodName();访问模型,“java”这里是标识符,或者我如何调用它?它不完全是实例,所以我不会这样称呼它。

编辑: 这是我的Java类:

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

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

1 个答案:

答案 0 :(得分:3)

根据this siteimport os os.system('mv /projects/project1/project1/file.txt /projects/project1/file.txt') os.system('rm -rf /projects/project1/project1/') 实际上会返回JavaScript Window对象。还有一大堆其他代码片段好看的东西!

在这种情况下,

webEngine.executeScript("window")是一个可以由JavaScript在Window对象中使用的处理程序。因此,引用java时,您的JavaScript可以访问java对象。

此外,您通常希望在JavaScript中使用DataModel刷新页面。

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