我正在尝试创建一个浏览器来练习 JavaFX。我用 Stack 实现了后退按钮。
- 当页面的URL发生变化时,将url添加到Stack(java.util.Stack)
- 按下后退按钮时,从 Stack 中弹出 1 项并显示页面
但这在 URL 重定向的情况下不起作用。例如。我输入http://www.google.com ,它会自动重定向到 http://www.google.co.in (印度)。这会在堆栈中产生 2 个条目,这会破坏“后退”按钮逻辑,因为页面相同但取自不同位置。
请帮我解决这个问题。
感谢您的帮助
webEngine.locationProperty().addListener(new ChangeListener<String>(){
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
//urlField is a text Field
urlField.setText(newValue);
addURLToStack(oldValue);
if(backButtonStack.size() ==1){ //means on last url of Stack
backButton.setDisable(true);
}
else{
backButton.setDisable(false);
}}
});
backButton.setOnMouseClicked(new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
if(backButtonStack != null && !backButtonStack.isEmpty()){
String poppedURL = backButtonStack.pop();
webEngine.load(poppedURL);
}
}
});
private void addURLToStack(String url) {
if(backButtonStack == null){
backButtonStack = new Stack<String>();
}
backButtonStack.push(url);
}
最佳答案
您不需要解决这个问题。
JavaFX WebEngine有一个WebHistory对象,它具有完全管理历史记录所需的所有 API,并且它应该注意不要将重定向的 URL 添加到历史记录中。而且,如果您不想使用它,可以使用 webengine.executeScript("history.back()");
让引擎的 JavaScript 引擎为您处理导航。
Chris Gerken 所说的关于监视 http 状态返回代码以确定是否将该对象放入历史记录中的说法是正确的。 JavaFX WebEngine 中的困难在于 http 状态返回代码发生在网络层,并且不通过 WebEngine 接口(interface)公开。因此,如果您只是像现在这样监视 WebEngine 的位置属性,那么很难获得高质量的导航界面。当我实现 JavaFX WebBrowser 以获得 JavaFX 体验时我发现了这一点,并且 my browser's history mechanism using an ObservableList with a current index pointer与您在问题中指出的问题完全相同。如果我今天要再次实现相同的功能,我只会使用后续 JavaFX 版本提供的新 WebHistory
功能,而不是编写自己的功能。
关于java - 浏览器后退按钮如何处理自动 URL 重定向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14170832/