【问题标题】:How to load both html and javascript into webengine from loadContent()?如何从 loadContent() 将 html 和 javascript 加载到 webengine 中?
【发布时间】:2013-12-08 11:12:04
【问题描述】:

有人可以提供一些关于如何从 loadContent() 将以下内容加载到 webviewer 的建议吗?

http://jsbin.com/aqupun/6/edit

我试图做这样的事情,但它似乎不起作用。谢谢!

    Scanner sc1 = new Scanner(new File("src/web/web.html"));
    String webStr = sc1.useDelimiter("\\Z").next();

    Scanner sc2 = new Scanner(new File("src/web/data.js"));
    String dataStr = sc2.useDelimiter("\\Z").next();

    Scanner sc3 = new Scanner(new File("src/web/cytoscape.min.js"));
    String cytoStr = sc3.useDelimiter("\\Z").next();

    Scanner sc4 = new Scanner(new File("src/web/jquery.min.js"));
    String jqueryStr = sc4.useDelimiter("\\Z").next();

    webEngine.loadContent(cytoStr, "text/javascript");
    webEngine.loadContent(jqueryStr, "text/javascript");
    webEngine.loadContent(dataStr, "text/javascript");
    webEngine.loadContent(webStr, "text/html");

【问题讨论】:

  • 您能否详细说明似乎不起作用 的含义? =)
  • 它最终起作用了;但你不能有任何古怪。没有我可以检测到的日志,并且不确定我们如何从引擎中戳和窥视状态值(还)。坚持下去。

标签: java web javafx cytoscape


【解决方案1】:

你首先需要把这三个文件放到同级的资源或者硬盘上。

要直接从内存中加载内容,您可以使用

webView.getEngine().loadContent("your html")

来自JavaDoc

public void loadContent(String content)

直接加载给定的内容。这个方法很有用 当您在内存中编写内容或从某个系统加载内容时 无法通过 URL 访问。

请注意,链接的资源应通过其 url 可用,即在磁盘或资源中。为了反映您的 Web 应用程序中的动态变化,我建议您从 JS 调用 Java。这可以通过向 JS 应用程序提供 Java 对象来完成:Communication between JavaFX and JavaScript inside WebView, using JSObject

您可以在此处找到浏览器演示和简化的 WebView 组件:Java GUI to display webpages and return HTML

【讨论】:

    【解决方案2】:

    我刚刚发现在 HTML 中使用 <base> 标记也可以解决问题:

    <html>
        <head>
            <title>The slash at the end of the href is important!</title>
            <base href="file:///absolute/path/to/your/docroot/" />
        </head>
        <body>
            <img src="image.png"/>
        </body>
    </html>
    

    如果您通过engine.loadContent(String) 加载上述代码,那么image.png 将从/absolute/path/to/your/docroot/image.png 加载。

    如果您需要加载多个资源,则此方法更容易,因为您只需在单个位置指定绝对路径。

    这已经用 Java 8u25 的WebView 进行了测试。

    【讨论】:

    • 这听起来像一个愚蠢的问题(但是)......当我加载字符串时,docroot 是什么 - ** .. load( someText, "text/html" )**,我不太确定这是一个愚蠢的问题。我已经注意到 load( URI ) 版本,打开了一个套接字并且 volia,一切正常。有没有人从 Web Kit 项目中得到提示?
    • @will 如果你问当你使用loadContentbase 会是什么,答案似乎是null。这就是我做&lt;script&gt;document.write(document.baseURI);&lt;/script&gt;时得到的
    • 为了加载相关资源(在HTML中指定),在使用loadContent时,似乎&lt;base&gt;href需要在加载前在HTML中设置。
    • Java 可以通过URL url = YourClass.class.getResource("yourResource.js");getting that resource's parent directory 等方式为您获取docroot 的绝对路径
    • @BradTurek ...感谢您的见解。看来,当 HTML 设置基数时,所有赌注都没有了。 document.baseUR 在 HTML(文档)中设置时是否给出正确的值?我认为我们不能设置 baseURI -- 否则它将没有效果 -- 因为 base 用于加载 HTML(&lt;head&gt;... 中的 everything 也是如此。哦,好吧......
    【解决方案3】:

    您只需要使用WebEngineload() 方法加载您的HTML 页面。相关 CSS 和 JavaScript 的加载将由 WebEngine 为您完成。

    这是我将AceEditor 加载到WebView 中的方式:

    执行此操作的代码只有两行:

    engine = webView.getEngine();
    engine.load("file:///home/littlejavachild/Downloads/AceEditor/ace-builds-master/MyTry.html");  
    

    JavaScript 源代码和 CSS 的加载由引擎为我处理。

    该方法的文档在这里:

    public void load(java.lang.String url)
    

    将网页加载到此引擎中。此方法异步启动 加载并立即返回。

    参数: url - 要加载的网页的 URL

    【讨论】:

    • 您好,感谢您的回答。这也可以,但是我有一个动态更新的页面,所以我想将它保存在内存中,而不是保存到硬盘上以便加载它。
    • 只提供网址。尝试从 webview 打开您的 Facebook 帐户。它将像真正的浏览器一样工作......没问题
    猜你喜欢
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多