我正在尝试创建一个浏览器,以便在JavaFX上练习。我用Stack实现了Back按钮。
但是这在URL重定向的情况下不起作用。例如。我输入http://www.google.com,它会自动重定向到http://www.google.co.in(印度)。这使得Stack中的2个条目破坏了Back按钮逻辑,因为页面是相同的但是从不同的位置获取。
请协助我解决这个问题。
感谢您的帮助
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);
}
答案 0 :(得分:2)
您无需解决此问题。
JavaFX WebEngine有一个WebHistory对象,其中包含完全管理历史记录所需的所有API,并且应该注意不要为您重定向路径添加重定向的URL。而且,如果您不想使用它,可以使用webengine.executeScript("history.back()");
让引擎的JavaScript引擎为您处理导航。
Chris Gerken所说的关于监控http状态返回代码以确定是否将对象放入历史记录是正确的。 JavaFX WebEngine
中存在的困难是http状态返回码发生在网络层,不通过WebEngine接口公开。因此,如果您只是在监视WebEngine的位置属性,那么获得高质量的导航界面将非常困难。我在实现JavaFX WebBrowser以获得JavaFX体验时发现了这一点,my browser's history mechanism using an ObservableList with a current index pointer与您在问题中指出的问题完全相同。如果我今天要再次实现相同的功能,我只会使用后来的JavaFX版本提供的新WebHistory
功能,而不是自己编写。
答案 1 :(得分:0)
我觉得您需要处理逻辑中的重定向。每当重新指示发生时;不要将原始URL放在数据结构中(堆栈或LinkedQueue);只在数据结构中放入最终的URL。当2-3次重定向发生时,您甚至可能面临条件。你需要把它变成通用的。
答案 2 :(得分:0)
只在您的堆栈中放入您实际显示的URL。在发送重定向上,您将获得状态代码307以及新URL。只把那个URL放在你的堆栈中(除非有一些奇怪的机会你又得到了另一个307 ...但你得到了这个想法)。
你可能想要使用列表而不是堆栈。这将让你前进和后退。您可能还需要保留其他内容,例如使用的HTTP谓词等。