Подтвердить что ты не робот

Очистка хеша URL-адреса

Посещение stackoverflow.com/#_=_ и window.location.hash оценивается как #_=_. Хорошо.

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

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

(MDN говорит

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Кстати (и в отношении ответов), window.location.hash и pushState - разные понятия, хотя близкие.

Ответ 3

Есть 2 вещи, которые ведут это поведение:

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

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

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

Ответ 4

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