2013-04-25 41 views
4

情況: 我有有這樣的JavaFX的WebView/WebEngine緩存外部JavaScript

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

正常的腳本標籤後我加載HTML一個簡單的HTML頁面,我更新main.js,和重新加載(通過UI按鈕)。

問題我沒有采取新的JS,我必須關閉應用程序並再次打開它。

我做了什麼: - 不使用webEngine.reload(),而是使用webEngine.load() - 每次重新加載時都創建一個新的瀏覽器。 -making一個新的階段,新的broswer -setting所有節點的緩存關閉 -in HTML下面的代碼

<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選項:-Dnetworkaddress.cache.ttl = 0。

問題 有什麼辦法刪除緩存或強制執行的WebView重裝不是追加我每次更新一個數字,JS文件名以外的所有的資源呢?

注:我使用NetBeans 7.3的Java最後(更新22)

回答

0

我如何工作圍繞的是:包含HTML文件和所有的JS文件到一個隨機生成的文件夾

  • 複製目標目錄。
  • 上的每一個加載生成一個新文件夾,複製內容,來自新文件夾中刪除舊的文件夾,負荷。

從「mcdonasm」答案是我試過,如果將工作在「main.js」是隻有JavaScript的事情之一,但如果它引用其他JS文件(如我的情況)時其他緩存。

0

我有一個類似的問題,當我與用戶編輯CSS文件的工作。 UI的目標是允許用戶編輯從給定的外部.html文件加載的外部.css文件,並在WebEngine中實時查看更改。

我也無法找到任何引用緩存清除或以任何方式強制WebEngine重新加載其所有資源。但是我確實想出了什麼是最好的解決方案。

我最終什麼事做是外部HTML文件的內容加載到內存中,並更換< link>標記引用相關的外部.css文件,與<風格>在線CSS標籤包含的內容的.css文件。然後我用

WebEngine.loadContent(EditedHTML); 

傳遞新編輯的HTML。這種技術可以很容易地被改變,以將外部JS文件加載到內嵌的< Script>標籤中。

這種技術對我來說工作得非常好,因爲我加載和編輯的所有文件都是本地的。我將它們的內容加載到內存中,並在應用程序啓動時保存對它們的引用。如果您試圖將JS文件添加到從服務器http請求中檢索的網頁中,那麼將這種技術包含到您的應用程序中可能會更加困難,但我認爲這不可能。

的具體實施將取決於你的應用程序的整體結構,但須藤代碼將是這樣的:

  1. 加載HTML文件的內容。
  2. 將內容解析爲HTML文檔。*
  3. 對於每個CSS < link>標籤
    1. 負載相關的CSS文件的內容
    2. 與<風格替換鏈接標籤>標籤誰的內容都加載CSS文件的內容
  4. 呼叫WebEngine.loadContent (editedHTML)

*爲了將內容解析到HTML文檔中,有許多有用且易於使用的庫,可以被利用。 This SO問題是尋找一些最常用的一個好地方。我使用jSoup並且發現它非常簡單,功能強大且有效,並且會建議您至少在選擇另一個之前查看/試用它。

這可能需要您的應用程序的一些重新構建,但是這種技術是迄今爲止我想出了最好的解決方案。如果您有任何問題/疑慮,請告訴我,我會盡力根據我對這項技術的經驗回答/解決這些問題。

+0

感謝您的回答,並且對我遲到的回覆感到抱歉。 我試過,但它沒有工作原因在我的主要JS其他被引用,我張貼我是如何解決它。 – 2013-09-13 10:48:24

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(); 
     } 
    } 
}); 

基本上強制重裝一次,它會刷新外部數據了。

0

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

當web視圖組件工作時,你應該記住,它 具有默認的內存緩存。這意味着一旦包含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數。 每次我們需要刷新時,最終數字都必須更改其值。
樣式表也一樣。
它爲我:-)

0

小時後我發現了一個很方便的方式,我想與大家分享:

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

顯然的JavaFX的WebView的JavaScript引擎完全支持JavaScript方法location.reload (真正)。 「真」會強制從服務器(或本地文件系統)重新加載資源。我嘗試了和。如果我更改了文件的內容並在WebEngine中執行上述js代碼,圖像被替換,並且js代碼在bar.js中執行更改。

不幸的是,沒有Java方法可以方便地訪問此功能。我承認,它並沒有真正清除緩存,但它重新加載了來源,這對於大多數情況來說應該是足夠的。

經JRE測試1.8.0_91