У меня есть 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('#'))
or
window.location.href.split('#')[0]
оба вернут URL без хеша или чего-либо после него.
Что касается вашего редактирования:
Любое изменение window.location
вызовет обновление страницы. Вы можете изменить window.location.hash
без запуска обновления (хотя окно будет прыгать, если ваш хэш совпадает с идентификатором на странице), но вы не можете избавиться от знака решетки. Выбирайте, что хуже ...
САМЫЙ АКТУАЛЬНЫЙ ОТВЕТ
Правильный ответ о том, как это сделать, не жертвуя (полной перезагрузкой или оставив там знак решетки), можно найти здесь. Оставим этот ответ здесь, но в отношении того, что он был исходным в 2009 году, тогда как правильный ответ, который использует новые API-интерфейсы браузера, был предоставлен через 1,5 года.
window.location
, но он просто удаляет его из возвращаемой строки.
- person Belladonna; 12.08.2013
window.location.hash=""
удалит хэш-идентификатор, но хеш в конце URL-адреса останется, например: /index.html#id
станет /index.html#
- person 27px; 05.12.2020
"/index.html#id".split("#") // ["/index.html","id"]
и "/index.html".split("#") // ["/index.html"]
- person 27px; 05.12.2020
В наши дни решение этой проблемы гораздо более доступно. 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.pushState()
вызовет событие hashchange. Скрипка в моем ответе демонстрирует это, переключая отключенное состояние кнопки в событии hashchange.
- person Andy E; 23.10.2018
href="#hash"
, чего и следовало ожидать, но оно не срабатывает после history.pushState
, о чем я предупреждаю людей
- person santiago arizti; 23.10.2018
history.replaceState('', document.title, window.location.origin + window.location.pathname + window.location.search);
Обратите внимание на добавление window.location.origin. Ответ, как указано выше, не работает в Chrome 70, но эта модификация работает. Протестировано в Firefox 63, Chrome 70, IE 11, Edge.
- person Neil Monroe; 03.11.2018
location.hash=""
3) прокрутка до привязки 4) запуск события hashchange Никто, кто не может предложить надежную реализацию setHash(hash, shouldChangeLocationBar, shouldHashRemain, shouldScroll, shouldTriggerEvent)
, не может утверждать, что решил проблему.
- person Szczepan Hołyszewski; 27.02.2019
(Слишком много ответов являются избыточными и устаревшими.) Лучшее решение сейчас - это:
history.replaceState(null, null, ' ');
history.pushState(null, null, ' ')
, если хотите сохранить историю.
- person nichijou; 05.01.2019
null
для параметров state
и title
.
- person V. Rubinetti; 01.02.2019
Просто и элегантно:
history.replaceState({}, document.title, "."); // replace / with . to keep url
.
вместо /
. Использование /
изменяет URL-адрес на корневой путь.
- person Isaac Gregson; 26.06.2015
history.replaceState({}, document.title, location.href.substr(0, location.href.length-location.hash.length));
для моего варианта использования.
- person Scott Jungwirth; 17.10.2015
history.replaceState(null, document.title, location.pathname + location.search);
- person MDMower; 25.10.2017
Чтобы удалить хеш, вы можете попробовать использовать эту функцию
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 = '';
}
Вы можете сделать это, как показано ниже:
history.replaceState({}, document.title, window.location.href.split('#')[0]);
Как насчет следующего?
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>
поместите этот код в раздел головы
Думаю, было бы безопаснее
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 Standard.
Основываясь на одном из приведенных выше ответов, используйте это:
var scrollV, scrollH
var loc = window.location;
scrollV = document.body.scrollTop;
scrollH = document.body.scrollLeft;
if ("pushState" in history) {
history.pushState("", document.title, loc.pathname + loc.search);
// Restore the scroll offset
document.body.scrollTop = scrollV;
document.body.scrollLeft = scrollH;
} else {
loc.hash = "";
// Restore the scroll offset
document.body.scrollTop = scrollV;
document.body.scrollLeft = scrollH;
}
Вы можете заменить хеш на null
var urlWithoutHash = document.location.href.replace(location.hash , "" );
replace
возвращает новую новую строку, а location.href
остается прежним. Как только вы сделаете location.href = urlWithouthHash
, вы получите обновление.
- person adripanico; 04.02.2021