2009-11-09 22 views
36

¿Contiene window.location.hash la representación codificada o decodificada de la parte url?Codificación de window.location.hash

Al abrir la misma URL (http://localhost/something/#%C3%BC donde %C3%BC se traduce en ü) en Firefox 3.5 e Internet Explorer 8, consigo diferentes valores para document.location.hash:

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

¿Hay alguna forma de obtener una variante en ambos navegadores?

Respuesta

37

Por desgracia, este es un error en Firefox, ya que decodifica location.hash un tiempo adicional cuando se accede a él. Por ejemplo, intente esto en Firefox:

location.hash = "#%30"; 
location.hash === "#0"; // This is wrong, it should be "#%30" 

La única solución multi-navegador es usar (location.href.split("#")[1] || "") lugar para obtener el hash. Sin embargo, configurar el hash usando location.hash parece funcionar correctamente para todos los navegadores compatibles con location.hash.

+0

Sí, parece ser la solución más razonable. – Michael

+0

Esta prueba devuelve 'false' como mínimo en Firefox 10.0.1. No estoy seguro de cuándo cambió pero, por supuesto, si desea admitir versiones anteriores, este sigue siendo el mejor consejo. – hippietrail

+1

¿Qué sucede si la parte hash contiene un #? En este caso, el método de división no funcionará. – Christophe

0

En realidad, en mi versión de Firefox (3.5 en Linux), si escribo "#% C3% BC" como un hash de la URL, la dirección URL propia realidad transforma a Unicode con "# u". Pero parece que respondió su propia pregunta: en Firefox, el navegador transforma los códigos de escape de la entidad en la URL, mientras que en IE no.

Mi consejo es en realidad: en lugar de poner "#% C3% BC" en la URL, simplemente use unicode completo en sus hash y URL. ¿Es eso una opción? Debería funcionar bien en cualquier navegador moderno.

+3

No, no es :(. Su Firefox (y el mío también) está pretendiendo usar un carácter 'ü'. En HTTP siempre usa la codificación porcentual. Mueva el mouse sobre ese enlace: http: // test /% C3% BC. La barra de estado de Firefox muestra un 'ü' por algún motivo, pero si usa un sniffer HTTP, descubrirá que está enviando'% C3% BC'. Y básicamente, porque estoy usando eso en un redireccionamiento HTTP, no puedo usar caracteres unicode de forma directa. – Michael

+0

¿Estás seguro de que no depende de que la codificación sea codificada en ASCII va unicode? –

+0

AFAIK no hay forma de transferir caracteres Unicode en HTTP sin una preparación especial como la codificación porcentual (porque HTTP no permite caracteres fuera del rango ASCII). – Michael

1

Puede utilizar decodeURIComponent, regresará en todos los casos:

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

¡Pruébalo here.

+2

No fue una solución porque: 'decodeURIComponent ('% 2540'); //% 40 (IE) ' pero ' decodeURIComponent ('% 40'); // @ (FF) ' – Michael

+0

No estoy seguro de lo que quiere decir,% 2540 es el carácter'% 'codificado ('% 25') y la cadena '40' no codificada,' decodeURIComponent ('% 40'); ' es @ en IE o Firefox ... http://jsbin.com/esafe – CMS

+4

Supongamos que quería usar el hash para una función de búsqueda y alguien quiere buscar '% 40' (pero no para' @ '). Dependiendo de su navegador, obtendré '#% 2540' (IE) o' #% 40' (FF) como 'location.hash'. Si lo decodifico, obtengo resultados diferentes en los diferentes navegadores. – Michael

4

Respondiendo a mi propia pregunta, mi solución actual es analizar window.location.href en lugar de usar window.location.hash, porque el primero siempre (es decir, en cada navegador) está codificado en la URL. Por lo tanto, la función decodeURIComponentCMS propuesta siempre se puede usar de forma segura. YUI hace lo mismo, por lo tanto, no puede ser tan malo ...

Cuestiones relacionadas