Очистка хэша URL

посетить stackoverflow.com/#_=_ и window.location.hash значение #_=_. Штраф.

теперь выполнить window.location.hash = '' чтобы очистить хэш, и URL-адрес становится stackoverflow.com/#. (Обратите внимание на трейлинг #.)

почему # на window.location.hash непоследовательно включено или исключено? Как # удалить из URL без перезагрузки страницы?

(MDN говорит

[хэш-это] часть URL-адреса, которая следует за символом#, включая символ.

но это неверно в случае пустого хэша.)

4 ответов


чтобы ответить на второй вопрос (удаление # без обновления страницы):

history.pushState('', document.title, window.location.pathname);

отвечая на ваш первый вопрос:

по словам окно.местоположение doc in Mozilla.org: " часть URL, которая следует за символом#, если он есть, включая символ#. пустая строка, если url-адрес не содержит # или не имеет ничего после #."

Любопытно, что этот документ был обновлен только 4/8/2013. Не уверен, что это было добавлено после проверки документации.

кстати (и в ссылка на ответы), окно.местоположение.хэш и pushState-это разные понятия, хотя и тесно связанные.


есть 2 вещи, управляющие этим поведением:

  • " установка свойства hash переходит к именованному якорю без перезагрузки документа."(здесь)
  • " при установке объекта location или любого из его свойств, кроме hash[...]В JavaScript 1.1 и более поздних версиях эффект установки местоположения зависит от настройки пользователя для сравнения документа с оригиналом по сети."(здесь)

Так в основном, установка свойства hash никогда не должна приводить к перезагрузке, установка любого другого свойства должна приводить к перезагрузке (или, возможно, e-Tag/modified-since header check, в зависимости от настроек браузера).

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


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