У меня есть 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 года.
Решение этой проблемы гораздо более доступно в наши дни. HTML5 History API позволяет манипулировать адресную строку для отображения любого 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. Для неподдерживаемых браузеров вы всегда можете написать изящно унизительный скрипт, который использует его там, где он доступен:
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;
}
}
Таким образом, вы можете избавиться от хеш-символа, но не во всех браузерах - пока.
Примечание: если вы хотите заменить текущую страницу в истории браузера, используйте replaceState()
вместо pushState()
.
(Слишком много ответов излишни и устарели.) Лучшее решение сейчас таково:
history.replaceState(null, null, ' ');
history.pushState(null, null, ' ')
вместо этого, если вы хотите сохранить историю.
null
для state
и title
параметров , в конечном счете делает.
Просто и элегантно:
history.replaceState({}, document.title, "."); // replace / with . to keep url
.
вместо /
. Использование /
изменения URL-адреса для корневого пути.
history.replaceState({}, document.title, location.href.substr(0, location.href.length-location.hash.length));
для моего варианта использования.
history.replaceState(null, document.title, location.pathname + location.search);
Чтобы удалить хеш, вы можете попробовать использовать эту функцию
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 = '';
}
Как насчет следующего?
window.location.hash=' '
Обратите внимание, что я устанавливаю хэш для одного пробела, а не для пустой строки.
Установка хэша в недействительную привязку также не вызывает обновления. Такие как,
window.location.hash='invalidtag'
Но я считаю, что приведенное выше решение вводит в заблуждение. Кажется, это указывает на то, что на данной позиции есть привязка с заданным именем, хотя ее нет. В то же время использование пустой строки приводит к тому, что страница перемещается наверх, что иногда может быть неприемлемым. Использование пробела также гарантирует, что всякий раз, когда URL копируется, добавляется в закладки и снова посещается, страница обычно будет наверху, а пробел будет игнорироваться.
И, эй, это мой первый ответ на StackOverflow. Надеюсь, кто-то найдет это полезным и соответствует стандартам сообщества.
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>
поместите этот код в головной раздел
function removeLocationHash(){
var noHashURL = window.location.href.replace(/#.*$/, '');
window.history.replaceState('', document.title, noHashURL)
}
window.addEventListener("load", function(){
removeLocationHash();
});
Я думаю, это было бы более безопасно
if (window.history) {
window.history.pushState('', document.title, window.location.href.replace(window.location.hash, ''));
} else {
window.location.hash = '';
}
Попробуйте следующее:
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 теперь является частью стандарта WhatWG HTML Living.
$(window).on('hashchange', function (e) {
history.replaceState("", document.title, e.originalEvent.oldURL);
});
Вы можете заменить хеш нулевым
var urlWithoutHash = document.location.href.replace(location.hash , "" );