Правильно закодированная строка декодируется при вставке в window.location.hash - PullRequest
4 голосов
/ 27 марта 2012

Цель: Правильно поместить строку из атрибута data в window.location.hash.

Код:

map = {path: $(this).attr('data-path'), rev: $(this).attr('data-rev')};
window.location.hash = getMapParams(map);

function getMapParams(map) {
  s="";
  for(key in map) {
    value=eval("map."+key);
    if (s.length > 0) {
      s+="&";
    }
    s+=encodeURIComponent(key)+"="+encodeURIComponent(value);
  }
  return s;
}

Проблема: Как только атрибут data-path содержит пробел, Firefox не может правильно поставить хеш. Пространство будет выглядеть незакодированным, тогда как в других браузерах оно правильно закодировано как %20.

Странные причуды: Если я отлаживаю код, строка выводится с закодированным пробелом.

Проведенное исследование: Я нашел множество решений для правильного чтения хеша в firefox. Так или иначе, это нормально работает с моим кодом.

Вопрос: Как мне остановить Firefox от urldecoding пробелов в строке, которую я помещаю в window.location.hash

1 Ответ

5 голосов
/ 27 марта 2012

Я обычно стараюсь избегать window.location.hash, потому что он не одинаков для всех браузеров.

Таким образом, вместо того, чтобы делать следующее

window.location.hash = "some hash value";

Я бы сделал

window.location.href = window.location.href.split("#")[0] + "#" + encodeURIComponent("some hash value");

Более того, хотя Firefox показывает декодированный хэш в адресной строке (то есть '' вместо% 20), если вы попытаетесь скопировать адрес, он фактически закодирован. Таким образом, показывается не то, что в URI.

Кроме того, я всегда обращаюсь к хешу, используя следующий код

var hash_val = window.location.href.split("#")[1] || "";
...