Mam adres URL typu: http://example.com#something
jak usunąć #something
, nie powodując odświeżenia strony?
Próbowałem następującego rozwiązania:
window.location.hash = '';
Nie usuwa to jednak symbolu skrótu #
z adresu URL.
Mam adres URL typu: http://example.com#something
jak usunąć #something
, nie powodując odświeżenia strony?
Próbowałem następującego rozwiązania:
window.location.hash = '';
Nie usuwa to jednak symbolu skrótu #
z adresu URL.
Odpowiedzi:
Wstępne pytanie:
window.location.href.substr(0, window.location.href.indexOf('#'))
lub
window.location.href.split('#')[0]
oba zwrócą adres URL bez skrótu lub cokolwiek po nim.
W odniesieniu do Twojej edycji:
Każda zmiana window.location
spowoduje wywołanie odświeżenia strony. Możesz zmienić window.location.hash
bez uruchamiania odświeżania (chociaż okno przeskoczy, jeśli Twój skrót pasuje do identyfikatora na stronie), ale nie możesz pozbyć się znaku skrótu. Wybierz coś, co jest gorsze ...
NAJBARDZIEJ AKTUALNA ODPOWIEDŹ
Prawidłowa odpowiedź na temat tego, jak to zrobić bez poświęcenia (pełne przeładowanie lub pozostawienie tam znaku skrótu) znajduje się tutaj . Pozostawiając tę odpowiedź tutaj, ponieważ jest oryginalna w 2009 roku, a poprawna, która wykorzystuje nowe interfejsy API przeglądarki została podana 1,5 roku później.
Rozwiązanie tego problemu jest obecnie znacznie bardziej dostępne. HTML5 History API pozwala nam manipulować pasek lokalizacji, aby wyświetlić dowolny adres URL w bieżącej domenie.
function removeHash () {
history.pushState("", document.title, window.location.pathname
+ window.location.search);
}
Działające demo: http://jsfiddle.net/AndyE/ycmPt/show/
Działa to w Chrome 9, Firefox 4, Safari 5, Opera 11.50 i IE 10. W nieobsługiwanych przeglądarkach zawsze możesz napisać wdzięcznie poniżający skrypt, który korzysta z niego, jeśli jest dostępny:
function removeHash () {
var scrollV, scrollH, loc = window.location;
if ("pushState" in history)
history.pushState("", document.title, loc.pathname + loc.search);
else {
// Prevent scrolling by storing the page's current scroll offset
scrollV = document.body.scrollTop;
scrollH = document.body.scrollLeft;
loc.hash = "";
// Restore the scroll offset, should be flicker free
document.body.scrollTop = scrollV;
document.body.scrollLeft = scrollH;
}
}
Możesz więc pozbyć się symbolu skrótu, ale nie we wszystkich przeglądarkach - jeszcze.
Uwaga: jeśli chcesz zastąpić bieżącą stronę w historii przeglądarki, użyj replaceState()
zamiast pushState()
.
(Zbyt wiele odpowiedzi jest zbędnych i nieaktualnych). Najlepszym rozwiązaniem jest teraz:
history.replaceState(null, null, ' ');
history.pushState(null, null, ' ')
zamiast tego, jeśli chcesz zachować historię.
null
do state
i title
parametrach ostatecznie robi.
Prosty i elegancki:
history.replaceState({}, document.title, "."); // replace / with . to keep url
.
zamiast /
. Użycie /
zmienia adres URL do ścieżki głównej.
history.replaceState({}, document.title, location.href.substr(0, location.href.length-location.hash.length));
dla mojego przypadku użycia.
history.replaceState(null, document.title, location.pathname + location.search);
Aby usunąć skrót, możesz spróbować użyć tej funkcji
function remove_hash_from_url()
{
var uri = window.location.toString();
if (uri.indexOf("#") > 0) {
var clean_uri = uri.substring(0, uri.indexOf("#"));
window.history.replaceState({}, document.title, clean_uri);
}
}
Spowoduje to również usunięcie końcowego skrótu. np .: http://test.com/123#abc -> http://test.com/123
if(window.history.pushState) {
window.history.pushState('', '/', window.location.pathname)
} else {
window.location.hash = '';
}
Co powiesz na następujące?
window.location.hash=' '
Pamiętaj, że ustawiam skrót w pojedynczej spacji, a nie w pustym ciągu.
Ustawienie skrótu na niepoprawną kotwicę również nie powoduje odświeżenia. Jak na przykład,
window.location.hash='invalidtag'
Ale powyższe rozwiązanie jest mylące. To wydaje się wskazywać, że na danym stanowisku znajduje się kotwica o podanym imieniu, chociaż nie ma takiego. Jednocześnie użycie pustego ciągu powoduje przejście strony na górę, co czasami może być nie do przyjęcia. Korzystanie ze spacji zapewnia również, że za każdym razem, gdy adres URL zostanie skopiowany, dodany do zakładek i ponownie odwiedzony, strona zwykle będzie na górze, a spacja zostanie zignorowana.
I, hej, to moja pierwsza odpowiedź na StackOverflow. Mam nadzieję, że ktoś uzna to za przydatne i zgodne ze standardami społeczności.
const url = new URL(window.location);
url.hash = '';
history.replaceState(null, document.title, url);
<script type="text/javascript">
var uri = window.location.toString();
if (uri.indexOf("?") > 0) {
var clean_uri = uri.substring(0, uri.indexOf("?"));
window.history.replaceState({}, document.title, clean_uri);
}
</script>
umieść ten kod w sekcji nagłówka
function removeLocationHash(){
var noHashURL = window.location.href.replace(/#.*$/, '');
window.history.replaceState('', document.title, noHashURL)
}
window.addEventListener("load", function(){
removeLocationHash();
});
Myślę, że byłoby bezpieczniej
if (window.history) {
window.history.pushState('', document.title, window.location.href.replace(window.location.hash, ''));
} else {
window.location.hash = '';
}
Spróbuj wykonać następujące czynności:
window.history.back(1);
Oto inne rozwiązanie, aby zmienić lokalizację za pomocą href i wyczyścić skrót bez przewijania.
Magiczne rozwiązanie wyjaśniono tutaj . Specyfikacje tutaj .
const hash = window.location.hash;
history.scrollRestoration = 'manual';
window.location.href = hash;
history.pushState('', document.title, window.location.pathname);
UWAGA: Proponowany interfejs API jest teraz częścią WhatWG HTML Living Standard
$(window).on('hashchange', function (e) {
history.replaceState("", document.title, e.originalEvent.oldURL);
});
Możesz zastąpić hash wartością null
var urlWithoutHash = document.location.href.replace(location.hash , "" );