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

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

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

window.location.hash = '';

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

Ответ 1

Начальный вопрос:

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

или

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

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

Что касается вашего редактирования:

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

САМЫЙ ОТВЕТ НА ДНЕЙ

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

Ответ 2

Решение этой проблемы в настоящее время гораздо более доступно. 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().

Ответ 3

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

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

Ответ 4

Простой и элегантный:

history.replaceState({}, document.title, ".");  // replace / with . to keep url

Ответ 5

Чтобы удалить хэш, вы можете попробовать использовать эту функцию

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);
    }
}

Ответ 6

Это также удалит завершающий хеш. например: http://test.com/123#abchttp://test.com/123

if(window.history.pushState) {
    window.history.pushState('', '/', window.location.pathname)
} else {
    window.location.hash = '';
}

Ответ 7

const url = new URL(window.location);
url.hash = '';
history.replaceState(null, document.title, url);

Ответ 8

Как насчет следующего?

window.location.hash=' '

Обратите внимание, что я устанавливаю хэш на одно место, а не пустую строку.


Установка хэша на недопустимый якорь не вызывает обновления. Например,

window.location.hash='invalidtag'

Но я считаю, что это решение ошибочно. Это, по-видимому, указывает на то, что на данной позиции есть якорь с заданным именем, хотя его нет. В то же время использование пустой строки приводит к тому, что страница переместится на верх, что может быть неприемлемо время от времени. Использование пробела также гарантирует, что всякий раз, когда URL-адрес будет скопирован, добавлен в закладки и снова посещен, страница, как правило, будет наверху, и пространство будет проигнорировано.

И, эй, это мой первый ответ на StackOverflow. Надеюсь, что кто-то сочтет это полезным и соответствует стандартам сообщества.

Ответ 9

<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>

поместите этот код в головной блок

Ответ 10

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

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

Ответ 11

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

window.history.back(1);

Ответ 12

Вот еще одно решение, чтобы изменить местоположение с помощью href и очистить хэш без прокрутки.

Магическое решение объясняется здесь. Спецификации здесь.

const hash = window.location.hash;
history.scrollRestoration = 'manual';
window.location.href = hash;    
history.pushState('', document.title, window.location.pathname);

ПРИМЕЧАНИЕ. Предлагаемый API теперь является частью стандарта HTMLWWW HTML

Ответ 13

  $(window).on('hashchange', function (e) {
        history.replaceState("", document.title, e.originalEvent.oldURL);
    });

Ответ 14

Вы можете заменить хэш нулевым

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