2013-03-10 2 views
29

Посетить stackoverflow.com/#_=_ и window.location.hash оценили по: #_=_. Хорошо.Очистить URL-адрес хэш-файла

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

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

(MDN говорит

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

, но это не верно для в случае пустой хэш)

+0

С каким браузером вы наблюдали это поведение? – Gumbo

+0

Посещение 'stackoverflow.com/#' также приводит к 'window.location.hash === ''', поэтому это последовательное поведение. –

+0

Вы говорите, что манипулирование 'hash' с помощью JavaScript приводит к' # 'в URL-адрес и пустое свойство' hash'. Теперь посещение страницы только с # # в URL-адресе также приводит к пустому свойству hash. Свойство 'hash' заполняется только тогда, когда в URL есть другие символы после' # ', и это согласованное поведение во всех браузерах. –

ответ

53

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

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

Примечание: pushState имеет значение IE10 и выше. –

+4

Я предпочитаю 'replaceState' для этого. – Banago

+2

Есть ли решение для IE9? Я попробовал 'window.location.href.replace (/#.*/," ");' но перезагружает страницу. –

0

Есть 2 вещи, движущая это поведение:.

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

Так в основном, устанавливая свойство хэш никогда не должно привести к перезагрузке, установив любое другое имущество должно привести к перезагрузке (или, возможно, E-Tag/Modified-Since проверки заголовка, в зависимости от настроек браузера).

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

4

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

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

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

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

-1

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