2013-08-19 69 views
3

當加載與之前加載的頁面具有相同url的頁面時,JavaFX顯示一些奇怪的行爲。下面的代碼演示了這個問題:WebView無法使用相同的URL重新加載頁面

類initalization加載頁面後,使用自定義樣式類將高亮區應用於任意html元素。此高亮顯示正確。

最後,通過用戶輸入事件,告知WebView加載一個新頁面(使用相同的URI)。不是按原樣顯示頁面,也會顯示高亮顯示。

WebView webView = new WebView(); 
static String URI = "http://www.example.com"; 

public void loadPage() { 
    // Step 1: load page 
    webView.getEngine().load(URI); 

    // Step 2: Change style attribute in page 
    (Element) element = xpath.evaluate("//div[@id='mydiv']", webView.getEngine().getDocument(), XPathConstants.NODE); 
    element.setAttribute("class", "mystyle"); 
} 

handle() { 
    // Step 3: load page again 
    webView.getEngine().load(URI); 
} 

我已經嘗試迫使頁面WebView.getEngine()重載。重載(),禁用緩存,等待工作人員來完成,等

我目前看到的唯一選擇是創建一個WebView的新實例,但由於這非常重要,所以我更喜歡重用該對象,而不是每次我想恢復到原始頁面時創建新對象。

+0

你是什麼意思「重建整個WebView」?調用'webView.getEngine().load(「你的url」);'再次就夠了。這就像一個網頁的清爽。無需重新創建webview實例。 –

+0

我已經重寫了我的文本,但是是的,因爲它是我唯一的工作解決方案,所以我每次需要重新加載之前與DOM文檔一起玩過的頁面時,都會創建一個webview的新實例。看起來DOM文檔在WebView引擎中被內部緩存。 – Stern

回答

1

這是一個SSCCE,演示重新加載HTML內容。它與你的方法有點不同,但故事是一樣的,但沒有嘗試加載像你這樣的外部URL。由於webEngine.reload()不會加載原始內容,因此您正在緩存webEngine。

public class WebViewReload extends Application { 

    private String content = "<html>" 
      + " <head>" 
      + "   <style type=\"text/css\">" 
      + "   .mystyle {" 
      + "    padding: 20px;" 
      + "    background-color: red;" 
      + "    font-size: 30px;" 
      + "   }" 
      + "  </style>" 
      + " </head>" 
      + " <body>" 
      + "  <div id=\"mydiv\">initial content</div>" 
      + " </body>" 
      + "</html>"; 

    @Override 
    public void start(final Stage stage) throws Exception { 
     final WebView webView = new WebView(); 
     webView.getEngine().loadContent(content); 
     // It is same as loading an external html source, like this 
     // webView.getEngine().load(getClass().getResource("my.html").toExternalForm()); 

     Button btn1 = new Button("Apply style"); 
     btn1.setPrefWidth(200); 
     btn1.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       Element element = webView.getEngine().getDocument().getElementById("mydiv"); 
       element.setAttribute("class", "mystyle"); 
       element.setTextContent("new content"); 
      } 
     }); 

     Button btn2 = new Button("Reload content"); 
     btn2.setPrefWidth(200); 
     btn2.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       webView.getEngine().loadContent(content); 
       // following does not reload at all 
       // webView.getEngine().reload(); 
      } 
     }); 

     VBox vbox = new VBox(10); 
     vbox.setPadding(new Insets(20)); 
     vbox.setStyle("-fx-background-color: gray"); 
     vbox.getChildren().addAll(webView, btn1, btn2); 

     Scene scene = new Scene(vbox); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

謝謝你確認問題Uluk。 – Stern

+0

@Stern。正如我之前所說,'webView.getEngine()。loadContent(content);'(在上面的「重新加載內容」按鈕中)加載了原始內容。大家是否同意這一點? –

+0

正確,也是有意義的,因爲loadContent需要重建DOM文檔。 我仍在研究這個問題。我發現在WebView中的用戶輸入事件後更新DOM文檔實際上按預期工作。看起來這樣的事件觸發了文件的內部審查。 – Stern

相關問題