Кодировка window.location.hash - PullRequest
       14

Кодировка window.location.hash

40 голосов
/ 09 ноября 2009

Содержит ли window.location.hash закодированное или декодированное представление части URL?

Когда я открываю тот же URL (http://localhost/something/#%C3%BC, где %C3%BC переводится в ü) в Firefox 3.5 и Internet Explorer 8, я получаю разные значения для document.location.hash:

  • IE8: #%C3%BC
  • FF3,5:

Есть ли способ получить один вариант в обоих браузерах?

Ответы [ 4 ]

38 голосов
/ 10 ноября 2009

К сожалению, это ошибка в 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.

6 голосов
/ 10 ноября 2009

Отвечая на мой собственный вопрос, мое текущее решение состоит в том, чтобы проанализировать window.location.href вместо использования window.location.hash, поскольку первое всегда (т. Е. В каждом браузере) кодируется по URL. Поэтому предложенную decodeURIComponent функцию CMS всегда можно безопасно использовать. YUI делает то же самое, поэтому это не может быть неправильно ...

4 голосов
/ 09 ноября 2009

Вы можете использовать decodeURIComponent, он вернет во всех случаях:

decodeURIComponent('#%C3%BC'); // #ü
decodeURIComponent('#ü'); // #ü

Попробуйте здесь .

0 голосов
/ 09 ноября 2009

На самом деле в моей версии Firefox (3.5 для Linux), если я введу "#% C3% BC" в качестве хэша в URL, сам URL фактически преобразует в unicode с "# ü" , Но вы, похоже, ответили на свой собственный вопрос - в Firefox браузер преобразует escape-коды сущностей в URL, а в IE - нет.

Мой совет на самом деле таков: вместо того, чтобы вообще ставить «#% C3% BC» в URL, просто используйте полный юникод в ваших хешах и URL. Это вариант? Он должен нормально работать в любом современном браузере.

...