Obawiam się, że może to być niemożliwe, ale czy istnieje sposób na zmianę wartości skrótu adresu URL bez pozostawiania wpisu w historii przeglądarki i bez ponownego ładowania ? Albo zrobić odpowiednik?
Jeśli chodzi o szczegóły, opracowałem podstawową nawigację z hashami w następujący sposób:
//hash nav -- works with js-tabs
var getHash = window.location.hash;
var hashPref = "tab-";
function useHash(newHash) {
//set js-tab according to hash
newHash = newHash.replace('#'+hashPref, '');
$("#tabs li a[href='"+ newHash +"']").click();
}
function setHash(newHash) {
//set hash according to js-tab
window.location.hash = hashPref + newHash;
//THIS IS WHERE I would like to REPLACE the location.hash
//without a history entry
}
// ... a lot of irrelavent tabs js and then....
//make tabs work
$("#tabs.js-tabs a").live("click", function() {
var showMe = $(this).attr("href");
$(showMe).show();
setHash(showMe);
return false;
});
//hash nav on ready .. if hash exists, execute
if ( getHash ){
useHash(getHash);
}
Oczywiście przy użyciu jQuery. Chodzi o to, że w tym konkretnym przypadku 1) zmuszanie użytkownika do powrotu do każdej zmiany karty może skutecznie `` złamać przycisk Wstecz '' poprzez gromadzenie niepotrzebnych odwołań, i 2) nie zachowywanie karty, na której jest obecnie, po naciśnięciu przycisku odświeżania irytacja.
Odpowiedzi:
location.replace("#hash_value_here");
działało dobrze, dopóki nie odkryłem, że nie działa na IOS Chrome. W takim przypadku użyj:Pamiętaj, aby zachować
#
lub ostatnia część adresu URL zostanie zmieniona.źródło
window.location.hash = 'my-hash';
a następniehistory.replaceState(undefined, undefined, "#my-hash")
?history.replaceState
różni odlocation.replace
?Wydaje się, że powyższe robi to, czego szukasz.
źródło
window.location.replace(('' + window.location).split('#')[0] + '#' + hash);
aby po prostu zaktualizować skrót<base href ="http://example.com/" />
Jeśli zawiera znacznik podstawowy , wtedy kiedy użyjesz metody replace tylko z początkiem"#hash_value_here"
, w rzeczywistości będzie to tak, jakbyś powiedział `location.replace (' example.com/#hash_value_here' ). Wydaje się to oczywiste, gdy czytasz to tutaj, ale jest to problem, gdy jesteś na stronie z fragmentem ścieżki i nie zdajesz sobie sprawy, że podstawa jest ustawiona.Edycja: minęło już kilka lat, a przeglądarki ewoluowały.
@ Luxiyalu za odpowiedź jest droga
- Stara odpowiedź -
Ja też uważam, że to niemożliwe (w tej chwili). Ale dlaczego musisz zmieniać wartość skrótu, jeśli nie zamierzasz jej używać?
Uważam, że głównym powodem, dla którego jako programiści używamy wartości skrótu, jest umożliwienie użytkownikowi dodania zakładek do naszych stron lub zapisanie stanu w historii przeglądarki. Jeśli nie chcesz tego robić, po prostu zapisz stan w zmiennej i zacznij od tego.
Myślę, że powodem używania hasha jest praca z wartością, która jest poza naszą kontrolą. Jeśli jej nie potrzebujesz, prawdopodobnie oznacza to, że masz wszystko pod kontrolą, więc po prostu zapisz stan w zmiennej i pracuj z nią. (Lubię się powtarzać)
Mam nadzieję, że to ci pomoże. Może jest łatwiejsze rozwiązanie twojego problemu.
UPDATE: Co powiesz na to:
window.history.back(1)
, co spowoduje, że historia wróci z pierwszego skrótu init.Prawdopodobnie będziesz musiał użyć kilku flag, aby wiedzieć, czy bieżący wpis można „usunąć”, cofając się, czy po prostu pominiesz pierwszy krok. I aby upewnić się, że twoja metoda ładowania "hasha" nie zostanie wykonana, gdy wymusisz rozszerzenie
history.back
.źródło
?mystate=greatness
), nawet jeśli nie musi to być ajax, możesz zapisać informacje do odczytania przez javascript podczas inicjowania żądania.Zawsze możesz utworzyć detektor zdarzeń, który będzie przechwytywał zdarzenia kliknięcia w hiperłączu, aw funkcji wywołania zwrotnego umieść e.preventDefault (), co powinno uniemożliwić przeglądarce wstawienie go do historii.
źródło