Привет! Я использую GWT и его стандартный способ поддержки истории через класс «History». Это очень удобно, но как удалить анкерную часть из URL? Например:
Мой базовый URL:
http://www.mysuperwebsite.com/myapp
При использовании приложения я перемещаюсь в место, которое добавляет новый элемент истории.
В коде:
History.newItem("funnygame");
Как результат:
http://www.mysuperwebsite.com/myapp#funnygame
Я меняю место еще раз:
History.newItem("notsofunnygames");
http://www.mysuperwebsite.com/myapp#notsofunnygames
Тогда я хочу вернуться на свою домашнюю страницу (http://www.mysuperwebsite.com/myapp).
Что должно быть в коде?:
????
чтобы вернуться к:
Есть ли какой-нибудь стандартный способ достижения моей цели?
Если я добавлю что-то вроде этого:
History.newItem("");
или
History.newItem(null);
URL станет
http://www.mysuperwebsite.com/myapp#
И это не то, что я ищу, мне нужно это без острого характера.
Если вы используете History.newItem(null);, будет запущено новое событие.В результате вы переключите свою домашнюю страницу: http://www.mysuperwebsite.com/myapp#
Наличие или отсутствие символа # в конце - это одно и то же, я не прав?
РЕДАКТИРОВАНИЕ:
... // Get the last part of the url and remove #token String s = Location.getHref().substring(Location.getHref().lastIndexOf("/")); s = s.substring(0, s.indexOf("#")-1); setToken(s); ... protected native void setToken(String token) /*-{ $wnd.history.pushState({},'', token); }-*/;
Якорь идентифицируется как #, поэтому вы можете использовать следующее для его удаления:
#
int index = link.indexOf('#'); if (index != -1) { link = link.substring(0, index); }
Вы можете создать класс инструмента и вызывать его, когда История изменяется.
public class UrlUpdater { public static void removeHashIfEmpty() { if(isHashEmpty()) removeHash(); } private static boolean isHashEmpty() { return "#".equals(Window.Location.getHash()); } private static void removeHash() { updateURLWithoutReloading(Window.Location.createUrlBuilder().setHash(null).buildString()); } private static native void updateURLWithoutReloading(String newUrl) /*-{ $wnd.history.replaceState({}, null, newUrl); }-*/; }
Если вы не хотите использовать маркер истории, вы, вероятно, неправильно используете историю.Если вы не собираетесь возиться с навигацией, я бы порекомендовал использовать GwtEvent / EventHandler.По сути, это то, что делает класс History в gwt, помимо связи этих событий с историей навигации.