У мене є така 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 Standard
$(window).on('hashchange', function (e) {
history.replaceState("", document.title, e.originalEvent.oldURL);
});
Ви можете замінити хеш на null
var urlWithoutHash = document.location.href.replace(location.hash , "" );