2011-04-26 16 views
9

Estoy usando document.location.hash para conservar el estado en la página, y estoy colocando pares de valores clave codificados en la URL, separados por "&" caracteres. Hasta aquí todo bien.¿Hay alguna forma de que firefox no descodifique automáticamente los valores asignados a document.location.hash?

Sin embargo, me encuentro con un problema molesto en Firefox: Firefox descifrará en silencio el valor hash en el camino de entrada, por lo que cuando lo saques más tarde se habrá decodificado.

que puede parchear el problema mediante la detección cuando estoy corriendo en Firefox y llamando encodeURIComponent sobre todo dos veces en el camino, pero obviamente esto es horrible y yo realmente no quieren hacer eso.

Aquí está un ejemplo sencillo, en el que codificar "=" como "% 3D", lo puso en el hash, y cuando lo reciba más tarde está convirtiéndose de nuevo en "=" automáticamente:

// 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") 
} 

¿Tengo los dedos cruzados de tal vez que haya algún elemento de DOM oculto creado por Firefox que represente el valor de hash real (sin decodificar)?

pero la línea de fondo: ¿Alguien ha encontrado esto y ha encontrado una solución mejor que simplemente hacer la detección del navegador y llamar a encodeURIComponent dos veces en Firefox?

NOTA: muchas otras preguntas creo que tienen la misma causa raíz. Lo más notable es la siguiente:

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

+5

Me temo que no hay una buena manera de que un procedimiento diferente en firefox hasta que algún día arreglen el error: https://bugzilla.mozilla.org/show_bug.cgi?id=483304. Una opción puede ser extraer el hash de window.location usando String-functions. –

Respuesta

1

Yo les recomiendo vivamente contra el uso del valor hash para preservar el estado. Hash se supone que el punto de objetar fragmento-id, como se explica en RFC 1630

Esto representa una parte de, fragmento de, o una sub-función dentro de, un objeto . (...) El fragmento-id sigue la URL de todo el objeto del que está separado por un signo de almohadilla (#).

¿Hay algo que le impida usar cookies para preservar el estado? Las cookies son lo suficientemente simples de usar en JS, described on Geko DOM Reference pages, y harían el truco en silencio, sin agregar valores a la URL que nunca es bonita.

Si tiene que usar hash definitivamente, le recomendamos que cambie '=' por otro carácter, p. ":".

+2

Tengo el mismo problema que el autor. Usar cookies no es una solución cuando necesita propagar el estado que comparte la url. ¿Alguna otra solución que sea compatible con varios navegadores? Idealmente tendríamos html5 onpopstate. –

+1

Tenemos una solución aquí http://stackoverflow.com/questions/4835784/firefox-automatically-decoding-encoded-parameter-in-url-does-not-happen-in-ie –

0

Lo que podría hacer, es cambiar el "=" a algo más usando

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

Puede que tenga que ejecutar la línea por encima de un par de veces, dependiendo de la cantidad de "=" hay .

Luego el mismo proceso que tuvo como el anterior.

NB Si necesita más código, puede reemplazar [$ equals] de nuevo a "=" después de dividir el hash en una matriz.

Cuestiones relacionadas