gpt4 book ai didi

java - WebView 不重新加载具有相同 URL 的页面

转载 作者:搜寻专家 更新时间:2023-11-01 03:24:32 24 4
gpt4 key购买 nike

JavaFX 在加载与之前已加载的页面具有相同 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().reload() 强制页面重新加载、禁用缓存、等待工作人员完成等。

我目前看到的唯一选择是创建一个新的 WebView 实例,但由于这非常占用 CPU,所以我更愿意重用该对象,而不是每次我想恢复到原始页面时都创建一个新的对象。

最佳答案

这是一个 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);
}
}

关于java - WebView 不重新加载具有相同 URL 的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18312297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com