2

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

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());my 加载index.htmlWebView. 由于它是一个单页应用程序,这就是我所需要的,并且没有更多关于它的问题。

现在回到标题中的问题:
这一行是否:jsobj = (JSObject) webEngine.executeScript("window");设置对w3school 定义JSObject的“窗口对象”的引用?这意味着现在等于 window 对象,表示浏览器中打开的窗口? 如果是这样:如果我在 中的上下文菜单上使用“重新加载页面”,这是否可能是我的应用程序无法工作的原因,因为它会生成一个新的? 额外问题:在我的 JavaScript 中,我可以使用这里的“java”访问模型
jsobj

WebViewwindow object

java.methodName();标识符或我该如何称呼它?它不完全是instance,所以我不会这样称呼它。

编辑:这是我的 Java 类:

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

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

4

1 回答 1

3

根据这个站点webEngine.executeScript("window") 实际上会返回 JavaScript Window 对象。还有一大堆其他代码片段可供查看!

java在这种情况下,是 Window 对象内的 JavaScript 可以使用的处理程序。因此,您的 JavaScript 在引用时java可以期望访问该DataModel对象。

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

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

于 2016-04-13T13:38:34.533 回答