Есть ли способ заставить firefox не автоматически декодировать значения url, присвоенные document.location.hash? - PullRequest
11 голосов
/ 27 апреля 2011

Я использую document.location.hash для сохранения состояния на странице, и я помещаю туда пары кодированных значений URL-адресов, разделенные символами «&». Все идет нормально.

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

Я могу исправить проблему, обнаружив, когда я работаю в firefox, и вызывая encodeURIComponent для всего дважды по пути, но, очевидно, это отвратительно, и я действительно не хочу этого делать.

Вот простой пример, где я кодирую "=" как "% 3D", помещаю его в хеш, а когда я получаю его позже, он автоматически возвращается в "=":

// on the way in::
document.location.hash = "foo=" + encodeURIComponent("noisy=input");

//then later.....
// on the way out: 
var hash = document.location.hash;
kvPair = hash.split("=");

if (kvPair.length==2) {
    console.log("that is correct.")
} else if (kvPair.length==3) {
    console.log("oh hai firefox, this is incorrect")
}

Я скрестил пальцы на том, что может быть какой-то скрытый DOM-элемент, который создает firefox, представляет фактическое (не декодированное) хеш-значение?

но суть - кто-нибудь сталкивался с этим и нашел лучшее решение, чем просто обнаружение в браузере и двойной вызов encodeURIComponent в Firefox?

ПРИМЕЧАНИЕ: несколько других вопросов, я думаю, имеют ту же самую основную причину. Наиболее заметно это:

https://stackoverflow.com/questions/4834609/malformed-uri-in-firefox-not-ie-using-encodeuricomponenet-and-setting-hash

Ответы [ 2 ]

1 голос
/ 18 марта 2012

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

. Он представляет собой часть, фрагмент или подфункцию внутри объекта.(...) Идентификатор фрагмента следует URL-адресу всего объекта, от которого он отделен знаком хеша (#).

Что-нибудь мешает вам использовать куки для сохранения состояния?Cookies достаточно просты в использовании в JS, , описанном на страницах справки Geko DOM , и будут работать тихо, без добавления значений к URL-адресу, который никогда не бывает красивым.

Если вы абсолютно увереныхотя для использования хэша вы можете подумать о замене '=' другим символом, например ":".

0 голосов
/ 19 июня 2013

Что вы могли бы сделать, это изменить "=" на что-то другое, используя

var string = string2.replace("=", "[$equals]")

Возможно, вам придется выполнить строку выше пару раз, в зависимости от того, сколько"=" есть.

Затем тот же процесс, который вы выполняли, как описано выше.

NB Если вам потребуется его для дальнейшего кода, вы можете заменить [$ equals] обратно на "=" после разбиенияхеш в массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...