У меня есть URL-адрес: http://example.com#something
, как удалить #something
, не заставляя страницу обновляться?
Я попытался выполнить следующее решение:
window.location.hash = '';
Однако это не удаляет хеш-символ #
из URL-адреса.
У меня есть URL-адрес: http://example.com#something
, как удалить #something
, не заставляя страницу обновляться?
Я попытался выполнить следующее решение:
window.location.hash = '';
Однако это не удаляет хеш-символ #
из URL-адреса.
Начальный вопрос:
window.location.href.substr(0, window.location.href.indexOf('#'))
или
window.location.href.split('#')[0]
оба будут возвращать URL-адрес без хеша или чего-либо после него.
Что касается вашего редактирования:
Любое изменение window.location
приведет к обновлению страницы. Вы можете изменить window.location.hash
, не вызывая обновление (хотя окно будет прыгать, если ваш хеш совпадает с идентификатором на странице), но вы не можете избавиться от знака хэша. Сделайте свой выбор, для чего хуже...
САМЫЙ ОТВЕТ НА ДНЕЙ
Правильный ответ о том, как это сделать, не жертвуя (либо полная перезагрузка, либо оставляя хеш-знак там), здесь. Оставляя этот ответ здесь, хотя в отношении того, чтобы быть оригинальным в 2009 году, тогда как правильный, который использует новые API-интерфейсы браузера, был предоставлен через 1,5 года.
Решение этой проблемы в настоящее время гораздо более доступно. API истории HTML5 позволяет нам манипулировать панелью местоположений, чтобы отображать любой URL-адрес в текущем домене.
function removeHash () {
history.pushState("", document.title, window.location.pathname
+ window.location.search);
}
Рабочая демонстрация: http://jsfiddle.net/AndyE/ycmPt/show/
Это работает в браузерах Chrome 9, Firefox 4, Safari 5, Opera 11.50 и в IE 10. Для неподдерживаемых браузеров вы всегда можете написать изящно унижающий script, который использует его там, где он доступен:
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 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;
}
}
Итак, вы можете избавиться от символа хэша, просто не во всех браузерах -— все же.
Примечание. Если вы хотите заменить текущую страницу в истории браузера, используйте replaceState()
вместо pushState()
.
(Слишком много ответов излишни и устарели.) Лучшее решение сейчас таково:
history.replaceState(null, null, ' ');
Простой и элегантный:
history.replaceState({}, document.title, "."); // replace / with . to keep url
Чтобы удалить хэш, вы можете попробовать использовать эту функцию
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);
}
}
Это также удалит завершающий хеш. например: http://test.com/123#abc → http://test.com/123
if(window.history.pushState) {
window.history.pushState('', '/', window.location.pathname)
} else {
window.location.hash = '';
}
const url = new URL(window.location);
url.hash = '';
history.replaceState(null, document.title, url);
Как насчет следующего?
window.location.hash=' '
Обратите внимание, что я устанавливаю хэш на одно место, а не пустую строку.
Установка хэша на недопустимый якорь не вызывает обновления. Например,
window.location.hash='invalidtag'
Но я считаю, что это решение ошибочно. Это, по-видимому, указывает на то, что на данной позиции есть якорь с заданным именем, хотя его нет. В то же время использование пустой строки приводит к тому, что страница переместится на верх, что может быть неприемлемо время от времени. Использование пробела также гарантирует, что всякий раз, когда URL-адрес будет скопирован, добавлен в закладки и снова посещен, страница, как правило, будет наверху, и пространство будет проигнорировано.
И, эй, это мой первый ответ на StackOverflow. Надеюсь, что кто-то сочтет это полезным и соответствует стандартам сообщества.
<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>
поместите этот код в головной блок
Вы можете сделать это, как показано ниже:
history.replaceState({}, document.title, window.location.href.split('#')[0]);
Попробуйте следующее:
window.history.back(1);
Вот еще одно решение, чтобы изменить местоположение с помощью href и очистить хэш без прокрутки.
Магическое решение объясняется здесь. Спецификации здесь.
const hash = window.location.hash;
history.scrollRestoration = 'manual';
window.location.href = hash;
history.pushState('', document.title, window.location.pathname);
ПРИМЕЧАНИЕ. Предлагаемый API теперь является частью стандарта HTMLWWW HTML
$(window).on('hashchange', function (e) {
history.replaceState("", document.title, e.originalEvent.oldURL);
});
Вы можете заменить хэш нулевым
var urlWithoutHash = document.location.href.replace(location.hash , "" );