2013-08-19 3 views
3

JavaFX показывает некоторое нечетное поведение при загрузке страницы с идентичным URL-адресом на ранее загруженную страницу. Приведенный ниже код демонстрирует эту проблему:WebView не перезагружает страницу с идентичным URL

После инициализации класса загружается страница, затем выделение выделяется произвольному элементу 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 »);' again должно быть достаточно. Это похоже на обновление веб-страницы. Нет необходимости воссоздавать экземпляр webview. –

+0

Я переработал свой текст, но да, поскольку это единственное рабочее решение, которое я имею, это создать новый экземпляр webview каждый раз, когда я хочу перезагрузить страницу, для которой я играл с DOM Document раньше. Похоже, что DOM Document, получает кэширование внутри механизма WebView. – Stern

ответ

1

Это SSCCE, который демонстрирует перезагрузку содержимого HTML. Это немного отличается от вашего подхода, но история такая же, хотя и не пыталась загрузить внешний URL-адрес, как ваш. Вы правы в кэшировании webEngine, так как webEngine.reload() не загружает исходное содержимое.

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

Спасибо, что подтвердили проблему Улук. – Stern

+0

@Stern. Как я уже говорил, 'webView.getEngine(). LoadContent (content);' (в приведенной выше кнопке «Обновить контент») загружает исходный контент. Согласны ли мы с этим? –

+0

Правильно, а также имеет смысл, поскольку loadContent требует восстановления документа DOM. Я все еще рассматриваю этот вопрос. Я обнаружил, что обновление DOM-документа после того, как пользовательское событие ввода в WebView действительно работает по назначению. Похоже, что такое событие вызывает внутренний обзор документа. – Stern