Кодировка window.location.hash
Поддерживает ли window.location.hash
кодированное или декодированное представление части url?
Когда я открываю тот же url (http://localhost/something/#%C3%BC
, где %C3%BC
переводит на ü
) в Firefox 3.5 и Internet Explorer 8, я получаю разные значения для document.location.hash
:
Есть ли способ получить один вариант в обоих браузерах?
Ответы
Ответ 1
К сожалению, это ошибка в Firefox, поскольку она декодирует location.hash
дополнительное время, когда к нему обращаются. Например, попробуйте в Firefox:
location.hash = "#%30";
location.hash === "#0"; // This is wrong, it should be "#%30"
Единственное кросс-браузерное решение - просто использовать (location.href.split("#")[1] || "")
вместо того, чтобы получить хеш. Настройка хэша с использованием location.hash
, похоже, работает правильно для всех браузеров, поддерживающих location.hash
.
Ответ 2
Отвечая на мой собственный вопрос, моим текущим решением является разбор window.location.href
вместо использования window.location.hash
, потому что первый всегда (т.е. в каждом браузере) закодирован в url. Поэтому предлагаемая функция C decodeURIComponent
всегда может быть использована безопасно. YUI делает то же самое, поэтому не может быть так плохо...
Ответ 3
Вы можете использовать decodeURIComponent
, он вернет #ü
во всех случаях:
decodeURIComponent('#%C3%BC'); // #ü
decodeURIComponent('#ü'); // #ü
Попробуйте здесь.
Ответ 4
Собственно, в моей версии Firefox (3.5 на Linux), если я набираю "#% C3% BC" как хэш в URL-адресе, сам URL-адрес фактически преобразуется в unicode с помощью "# ü". Но вы, кажется, ответили на свой вопрос - в Firefox браузер преобразует escape-коды сущностей в URL-адрес, а в IE - нет.
Мой совет на самом деле заключается в следующем: вместо того, чтобы помещать "URL% C3% BC" в URL-адрес вообще, просто используйте полный юникод в своих хэшах и URL-адресах. Это вариант? Он должен хорошо работать в любом современном браузере.