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

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

Я попробовал следующее решение:

window.location.hash = '';

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


person Tom Lehman    schedule 09.09.2009    source источник
comment
Вы действительно хотите это сделать? Это вызовет обновление страницы.   -  person seth    schedule 09.09.2009
comment
Можно ли обойтись без обновления страницы?   -  person Tom Lehman    schedule 09.09.2009
comment
Это возможно. Этим занимаются библиотеки истории AJAX. Но это непросто, и почти в каждом браузере это нужно делать по-разному. Не то, во что ты хочешь попасть.   -  person Gabriel Hurley    schedule 09.09.2009
comment
Есть ли какие-либо соображения относительно того, чтобы оставить # кроме визуального?   -  person user29660    schedule 16.08.2016
comment
Возможный дубликат Измените URL без перезагрузки страницы   -  person PayteR    schedule 10.09.2017


Ответы (15)


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

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 года.

person Gabriel Hurley    schedule 09.09.2009
comment
Это просто неправильно, вы можете изменить window.location.hash, и это не вызовет обновления. - person Evgeny; 31.10.2010
comment
@Evgeny - Это мой ответ. Я прямо говорю, что изменение window.location.hash не вызовет обновления. Вы можете изменить window.location.hash без запуска обновления (хотя окно будет прыгать, если ваш хэш совпадает с идентификатором на странице). - person Gabriel Hurley; 01.11.2010
comment
Никакой перезагрузки страницы - вот в чем вопрос. Это не ответ, так как он требует / принудительно перезагружает страницу! - person Ed_; 28.05.2012
comment
тоже думаю, что это не должен быть ✓ответ - person abernier; 19.06.2012
comment
@abernier Согласен, не говорит, как удалить хеш из URL, только строку URL. - person Belladonna; 02.04.2013
comment
Если href имеет #, будут работать и методы substr, и split. Но если href не имеет #, метод substr возвращает пустую строку, а разделение возвращает href. - person dlaliberte; 23.05.2013
comment
@LittleBigBot явно просто: window.location = window.location.href.split ('#') [0]; ... - person AO_; 09.08.2013
comment
@smftre Я думаю, я имел в виду, что он не указывает, как удалить хеш из window.location, но он просто удаляет его из возвращаемой строки. - person Belladonna; 12.08.2013
comment
Это не ответ на вопрос OP. - person Bryce; 15.11.2013
comment
Оставим этот ответ здесь, но в отношении того, что он был оригинальным в 2009 году, тогда как правильный, который использует новые API-интерфейсы браузера, был предоставлен через 1,5 года. Лучший ответ должен быть вверху, а не первый или что-то еще. Дело не в статусе. Речь идет о предоставлении людям наилучшей информации. Либо отредактируйте этот ответ, чтобы включить лучшую информацию, либо сделайте лучшую информацию принятым ответом. - person Trott; 21.04.2017
comment
это правильный ответ и прекрасно объяснен. - person tfont; 06.09.2017
comment
спасибо за обновление с текущим ответом позже в ветке OP ‹3 - person Thomas; 09.10.2017
comment
@Evgeny window.location.hash="" удалит хэш-идентификатор, но хеш в конце URL-адреса останется, например: /index.html#id станет /index.html# - person 27px; 05.12.2020
comment
@dlaliberte, если в строке s нет разделителя для разделения, функция split () вернет исходную строку в массиве, а не пустую строку, например: "/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().

person Andy E    schedule 14.03.2011
comment
Используйте эту строку, чтобы не потерять строку запроса: history.pushState (, document.title, window.location.pathname + window.location.search); - person Phil Kulak; 13.03.2012
comment
@Phil: спасибо, что указали на это, я соответствующим образом обновил ответ. Я слишком привык использовать красивые URL-адреса. - person Andy E; 13.03.2012
comment
Для более старых версий IE кажется, что вам нужно использовать document.documentElement вместо document.body. См. Этот ответ stackoverflow.com/a/2717272/359048 - person jasonmcclurg; 15.08.2013
comment
Я предлагаю использовать replaceState вместо pushState, чтобы не создавать лишнюю запись в истории браузера. - person Nico; 06.10.2013
comment
Есть ли разница между [location.hash =;] и вызовом предлагаемой функции [removeHash ();]. becoz для меня, оба выдают одну и ту же ошибку на консоли: [Ошибка: достигнуто 10 итераций $ digest (). Прерывание!] Есть предложения? - person NawazSE; 18.09.2014
comment
Я думаю, что history.pushState не вызовет hashshange, тогда как window.location.hash будет. Для меня это событие очень важно, так что будьте осторожны - person santiago arizti; 23.10.2018
comment
@santiagoarizti: history.pushState() вызовет событие hashchange. Скрипка в моем ответе демонстрирует это, переключая отключенное состояние кнопки в событии hashchange. - person Andy E; 23.10.2018
comment
интересно, я сделал свою собственную скрипку, чтобы продемонстрировать, что она не работает, прежде чем я написал здесь комментарий ... посмотрите: jsfiddle .net / k76qefn1 - person santiago arizti; 23.10.2018
comment
хорошо, я проверил вашу скрипку, и событие hashchange срабатывает только при щелчке href="#hash", чего и следовало ожидать, но оно не срабатывает после history.pushState, о чем я предупреждаю людей - person santiago arizti; 23.10.2018
comment
@santiagoarizti: ты прав, я только что пришел к такому же выводу. Я не проверил код, который я написал (7 лет назад!), И пропустил, что я также переключал состояние кнопки при удалении хеша. Поскольку вы меняете хэш вручную, я полагаю, вы всегда можете инициировать событие самостоятельно. - person Andy E; 23.10.2018
comment
В (по крайней мере) Firefox 63 вам понадобится полный URL-адрес (включая доменное имя) для выполнения проверок безопасности. 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
comment
Хорошо, похоже, что проблема была недооценена исходным плакатом, поэтому мне нужно указать: мне нужен АБСОЛЮТНЫЙ, АВТОКРАТИЧЕСКИЙ И ТИРАННЫЙ КОНТРОЛЬ над следующими аспектами поведения НЕЗАВИСИМО: 1) хеш-часть URL-адреса в изменяемом местоположении 2) завершающий # в URL остается или исчезает после location.hash="" 3) прокрутка до привязки 4) запуск события hashchange Никто, кто не может предложить надежную реализацию setHash(hash, shouldChangeLocationBar, shouldHashRemain, shouldScroll, shouldTriggerEvent), не может утверждать, что решил проблему. - person Szczepan Hołyszewski; 27.02.2019
comment
@Nico Ваш комментарий очень полезен при нажатии кнопки "Назад", потому что я не хочу возвращаться назад с помощью #string. Спасибо за экономию времени. - person Bhavin Thummar; 29.05.2019

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

history.replaceState(null, null, ' ');
person Pacerier    schedule 19.03.2018
comment
вместо этого используйте history.pushState(null, null, ' '), если хотите сохранить историю. - person nichijou; 05.01.2019
comment
Было бы полезно объяснить, что в конечном итоге дает передача null для параметров state и title. - person V. Rubinetti; 01.02.2019
comment
Проблема с этим и остальным в том, что он не запускает onhashchange, даже если хеш теперь пуст, а не раньше. - person Curtis; 20.09.2019
comment
В TypeScript значение NULL для второго параметра недопустимо, поскольку команда принимает строку. Mozilla рекомендует пустую строку. - person Curtis; 20.09.2019
comment
это поведение где-то задокументировано? поддерживается ли он всеми браузерами / версиями? - person madd0; 22.02.2021

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

history.replaceState({}, document.title, ".");  // replace / with . to keep url
person cprcrack    schedule 26.01.2015
comment
используйте точку вместо косой черты, если хотите оставаться в том же каталоге - person vahanpwns; 11.06.2015
comment
Обновите ответ относительно примечания @vahanpwns, чтобы использовать . вместо /. Использование / изменяет URL-адрес на корневой путь. - person Isaac Gregson; 26.06.2015
comment
Я обновил ответ, чтобы лучше понять, что происходит в примере. - person vahanpwns; 28.06.2015
comment
Спасибо за этот ответ, я изменил его на history.replaceState({}, document.title, location.href.substr(0, location.href.length-location.hash.length)); для моего варианта использования. - person Scott Jungwirth; 17.10.2015
comment
Это не сохраняет запрос URL. - person Vladislav Kostenko; 26.06.2017
comment
Мой вариант использования также заключался в замене вместо push, но для меня это имеет больше смысла: 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);
    }
}
person Rahul Gupta    schedule 07.02.2017

Это также удалит конечный хеш. например: http://test.com/123#abc -> http://test.com/123

if(window.history.pushState) {
    window.history.pushState('', '/', window.location.pathname)
} else {
    window.location.hash = '';
}
person Chris Gunawardena    schedule 17.08.2016
comment
Это удаляет все параметры запроса, присутствующие в URL :( - person kevgathuku; 02.08.2018
comment
@kevgathuku, вы можете добавить их обратно с помощью location.search, например: `window.history.pushState (',' / ', window.location.pathname + window.location.search)` - person Chris Gunawardena; 02.08.2018
comment
его работа, но я хочу также удалить # - person Viral M; 04.02.2021

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

history.replaceState({}, document.title, window.location.href.split('#')[0]);
person METALHEAD    schedule 23.09.2018
comment
Помеченный звездочкой ответ в любом случае не сработал для меня, а вот этот. Спасибо! - person Dev; 29.04.2020

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

window.location.hash=' '

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


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

window.location.hash='invalidtag'

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

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

person Nibras Reeza    schedule 07.02.2015
comment
Установка хэша на пробел по-прежнему сохраняет # в конце URL-адреса, я думаю, цель состоит в том, чтобы полностью удалить его. - person mahemoff; 04.02.2016
comment
Он отслеживает хэш в конце URL-адреса. Вопрос в том, как это убрать. - person Gurmeet Singh; 11.09.2017
comment
Да, как мы можем удалить # с помощью хеш-строки. - person Bhavin Thummar; 29.05.2019

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

поместите этот код в раздел головы

person Manigandan Raamanathan    schedule 07.01.2016

Думаю, было бы безопаснее

if (window.history) {
    window.history.pushState('', document.title, window.location.href.replace(window.location.hash, ''));
} else {
    window.location.hash = '';
}
person Konstantin Lekh    schedule 22.01.2020

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

window.history.back(1);
person Vishal Sharma    schedule 13.07.2013
comment
Это не отвечает на вопрос, перешел ли пользователь напрямую по URL-адресу, включая хэш. - person nickb; 05.01.2014
comment
Этот трюк очень полезен, когда вы просто хотите создать ссылку на предыдущую страницу, но ссылка скрыта в группе файлов js. - person ValidfroM; 15.04.2014
comment
Именно то, что я искал. Это отлично работает для удаления хэштега, только что созданного моим веб-приложением, чтобы использовать значение, возвращаемое функцией javasript. - person user278859; 07.06.2018

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

person voscausa    schedule 29.11.2017

Основываясь на одном из приведенных выше ответов, используйте это:

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;
}
person Engineersticity    schedule 17.05.2021

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

var urlWithoutHash = document.location.href.replace(location.hash , "" );
person Devang Bhagdev    schedule 27.09.2013
comment
Вопрос задается без обновления страницы, но этот метод обновляет страницу. Вы должны отметить этот факт в своем ответе, чтобы нам всем не приходилось тратить время на то, чтобы из первых рук узнать, что вы отвечаете не на тот вопрос, на который мы на самом деле пытаемся получить здесь ответ. - person Vladimir Kornea; 09.01.2015
comment
Страница не обновляется. - person Ciprian; 01.07.2016
comment
Он не обновляет страницу, потому что не обновляет URL-адрес. replace возвращает новую новую строку, а location.href остается прежним. Как только вы сделаете location.href = urlWithouthHash, вы получите обновление. - person adripanico; 04.02.2021

person    schedule
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. - person rollstuhlfahrer; 02.04.2018