5

Situation: I have a Simple HTML page which have a normal script tag like this

<script src="main.js"></script>

After i load the html , i update the main.js , and make a reload (throught UI Button).

The Problem My new JS is not taken , i must close the Application and open it again.

What i did try: -not using webEngine.reload() , but webEngine.load() -making a new broswer every time a reload occurs. -making a new stage with a new broswer -setting all nodes caching off -in HTML following code

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

-InetAddressCachePolicy:

InetAddressCachePolicy.setNegativeIfNotSet(InetAddressCachePolicy.NEVER);

-VM Options: -Dnetworkaddress.cache.ttl=0.

The Question Is there any way to delete the cache or enforce the WebView to reload all resources other than appending a number to JS filename every time i update it?

Note:I use NetBeans 7.3 With last Java (update 22)

4

6 回答 6

1

几个小时后,我找到了一种非常方便的方式来分享:

webEngine.setJavaScriptEnabled(true);
webEngine.executeScript("location.reload(true);");

显然,JavaFX WebView 的 JavaScript 引擎完全支持 JavaScript 方法 location.reload(true)。“true”强制从服务器(或本地文件系统)重新加载资源。我用 and 试过了。如果我更改文件的内容并在 WebEngine 中执行上述 js 代码,图像将被替换并且 js 代码按照 bar.js 中的更改执行。

不幸的是,没有 Java 方法可以方便地访问此功能。

我承认,它并没有真正清除缓存,但它会重新加载源,这对于大多数情况来说应该足够了。

在 JRE 1.8.0_91 中测试

于 2018-02-23T15:45:22.413 回答
1

如此处所述:http: //docs.oracle.com/javafx/8/webview/overview.htm

使用 WebView 组件时,您应该记住它具有默认的内存缓存。这意味着一旦包含 WebView 组件的应用程序关闭,所有缓存的内容都会丢失。

因此,如果我们在 Webview 中“即时”更改脚本或 css 文件,则不会重新加载/刷新该文件 :-(
我找到了另一种解决方法,与此不同(而且看起来更简单)从@Rany 找到。我会解释它,希望它可以帮助某人......

只需在对脚本或样式表的调用结束时添加自定义参数
例如,改为这样写:

<script type="text/javascript" src="javascript.js"></script>

写这个:

<script type="text/javascript" src="javascript.js?c=r_963"></script>

其中“r_963”是一个“r_”字符串,后跟一个随机的 0-999 int 数。 每次我们需要刷新时,最终数字都必须更改其值。
样式表也是如此。
这个对我有用 :-)

于 2016-11-03T00:04:28.527 回答
0

当我使用用户编辑的 css 文件时,我遇到了类似的问题。UI 的目标是允许用户编辑从给定的外部 .html 文件加载的外部 .css 文件,并在 WebEngine 中实时查看更改。

我也找不到任何对缓存的引用以清除或以任何方式强制 WebEngine 重新加载其所有资源。但我确实想出了一个效果很好的解决方案。

我最终做的是将外部 html 文件的内容加载到内存中,并将引用相关外部 .css 文件的 <link> 标记替换为包含 .css 内容的 <style> 内联 css 标记文件。然后我用

WebEngine.loadContent(EditedHTML); 

传递新编辑的HTML。这种技术可以很容易地修改为将外部 JS 文件加载到内联的 < Script > 标签中。

这种技术对我来说非常有效,因为我正在加载和编辑的所有文件都是本地的。我将它们的内容加载到内存中,并在应用程序启动时保存对它们的引用。如果您尝试将 JS 文件添加到从服务器 http 请求中检索到的网页中,那么将这种技术包含到您的应用程序中可能会更困难,但我认为这不是不可能的。

具体实现将取决于您的应用程序的整体结构,但 sudo 代码将是这样的:

  1. 加载 html 文件的内容。
  2. 将内容解析为 HTML 文档。*
  3. 对于每个 css <link> 标签
    1. 加载关联的 css 文件的内容
    2. 将链接标签替换为 <style> 标签,其内容是加载的 css 文件的内容
  4. 调用 WebEngine.loadContent(editedHTML)

*为了将内容解析为 HTML 文档,可以使用许多有用且易于使用的库。这个SO Question 是寻找一些最常用的问题的好地方。我使用 jSoup 并发现它非常简单、强大且有效,并且建议您至少先看看/尝试一下,然后再选择其他的。

这可能需要对您的应用程序进行一些重组,但这种技术是迄今为止我想出的最佳解决方案。如果您有任何问题/疑虑,请告诉我,我将尝试根据我对这项技术的经验来回答/解决这些问题。

于 2013-06-17T20:04:00.203 回答
0

我是如何解决这个问题的:

  • 将包含 HTML 文件和所有 JS 文件的目标目录复制到随机生成的文件夹中。
  • 在每次重新加载时生成一个新文件夹,复制内容,删除旧文件夹,从新文件夹加载。

“mcdonasm”的答案是我尝试过的事情之一,如果在“main.js”中只有 JavaScript,它会起作用,但如果它引用其他 JS 文件(如我的情况),其他的将被缓存。

于 2013-09-13T10:47:48.967 回答
0

我有类似的要求,但想要一个固定的目录位置。这对我有用:

first = true;
final WebView view = new WebView();
view.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {

    @Override
    public void changed(ObservableValue<? extends Worker.State> ov, Worker.State t, Worker.State t1) {
        System.out.println(t1);
        if(t1.equals(State.SUCCEEDED) && first) {
            first = false;
            view.getEngine().reload();
        }
    }
});

基本上强制重新加载一次,它也会刷新外部数据。

于 2015-01-26T14:33:29.030 回答
0

我有一个类似的问题,但与样式表。我正在开发一个 Web 创作工具,并希望在显示的 HTML 文件中反映样式表的更改,而无需重新启动应用程序。

我发现唯一可行的方法是创建一个新的 WebView 对象(从不显示)并在其中显式加载样式表。完成后,刷新引用该样式表的任何 html 文件将自动反映更改。

/** Forces an update to the internally-cached stylesheet.
 * @param file The CSS file.
 */
private void updateInternalCache(File file) {
    WebView cssLoader = new WebView();
    String fileLocation = file.toURI().toString();
    cssLoader.getEngine().load(fileLocation);
}
于 2019-03-21T18:41:49.797 回答