Как удалить хэш из окна.расположение (URL) с JavaScript без обновления страницы?

у меня есть URL, как:http://example.com#something, Как убрать #something, не вызывая обновления страницы?

Я попытался выполнить следующее решение:

window.location.hash = '';

однако это не удаляет хэш-символ # из URL.

13 ответов


первый вопрос:

window.location.href.substr(0, window.location.href.indexOf('#'))

или

window.location.href.split('#')[0]

оба вернут URL без хэша или чего-либо после него.

в отношении изменить:

изменения window.location вызовет обновление страницы. Вы можете изменить window.location.hash без запуска обновления (хотя окно будет прыгать, если ваш хэш-код совпадает с кодом на странице), но вы не можете избавиться от хэш-знак. Возьмите свой выбор, для которого хуже...

БОЛЬШИНСТВО ДО-ЧТОБЫ-ДАТА ОТВЕТА

правильный ответ о том, как это сделать, не жертвуя (либо полная перезагрузка, либо оставляя знак хэша там) -здесь. Оставив этот ответ здесь, хотя и в отношении оригинального в 2009 году, тогда как правильный, который использует новые API браузера, был дан 1,5 года спустя.


решение этой проблемы в настоящее время гораздо более достижимо. The HTML5 история 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({}, 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);
    }
}

(слишком много ответов являются избыточными и устаревшими.) Лучшее решение сейчас таково:

history.replaceState(null, null, ' ');

Это также удалит конечный хэш. например: 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>

ставим этот код на головной секции


попробуйте следующее:

window.history.back(1);

вы можете заменить хэш на null

var urlWithoutHash = document.location.href.replace(location.hash , "" );

вот еще одно решение для изменения местоположения с помощью 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


вы можете сделать это, как показано ниже:

history.replaceState({}, document.title, window.location.href.split('#')[0]);