2011-01-29 6 views
14

Tengo frustración entre Firefox e IE, bueno sobre todo Firefox ya que está decodificando automáticamente un parámetro en el hash antes de que pueda trabajar con él en Javascript. IE no decodifica automáticamente la url y no me da errores de lectura.Firefox decodifica automáticamente el parámetro codificado en url, no ocurre en IE

Mi problema es similar a éste, excepto que no estoy usando ASP.NET ASP.NET MVC automatically decoding JSON-encoded parameters from AJAX

Así que si tomo una URL como example.com/#question=!%40%23%24%25^%26*(

mientras que el "!% 40% 23% 24% 25%^26 * ("se codificó usando encodeURIComponent, en IE cuando accedo al hash quedará como"!% 40% 23% 24% 25 ^% 26 * (", sin embargo, en Firefox, cuando accedo al hash es automáticamente decodificado en "! @ # $%^& * ("

El problema con esto es que en mi script estoy usando decodeURIComponent para decodificar el valor codificado, w Esto está bien si la cadena está codificada. Dado que ya está decodificado en Firefox, me da un error de secuencia URI mal formado, y IE no me da ningún error en absoluto.

¿Cómo puedo solucionar esto?

Respuesta

19

Después de buscar descubrí que este es un problema del navegador cruz, y es mejor utilizar location.href.split("#")[1] en lugar de window.location.hash

+0

Muchas gracias por esto. Me acabo de encontrar con el mismo problema en Fx (Chrome está bien) y location.href.split ("#!") [1] funcionó para mí también. – meloncholy

+1

Parece que Firefox no solucionará esto pronto. Han estado discutiendo el error desde 2002 :(https://bugzilla.mozilla.org/show_bug.cgi?id = 135309 y https://bugzilla.mozilla.org/show_bug.cgi?id=483304 – gregers

+0

Firefox está permitiendo "#" dentro de la cadena hash, por lo que puede ser más a prueba de balas para tan 'window.location.hash.split ("#"). empalme (1) .join ("#") '. – fourthnen

1

Esto es realmente lo que desea utilizar:

decodeURI(window.location.hash.substr(1)) 

En efecto ventana. location.href.split ("#!") [1] no es descodificado por FF automáticamente (al menos hoy).

+0

'window.location.hash' es en realidad la raíz del problema, por lo que esto no funcionará. Pero es como debió * haber sido ... – gregers

0

La respuesta anterior funciona, excepto en los casos en que su url contiene más de un #. Esto debería manejar todos los casos:

var hash = ""; 
var indexOfHash = location.href.indexOf("#"); 
if (indexOfHash > -1) { 
    hash = location.href.substring(indexOfHash); 
} 

Además, parece que esto debería solucionarse en Firefox pronto. Simplemente pulse el nocturnos de:

https://bugzilla.mozilla.org/show_bug.cgi?id=378962

0

he tenido este problema. Lo resolví con esta solución:

var currentLocation = document.location.hash; 
var decodedLocation = decodeURI(currentLocation); 
0

Esta es una pregunta muy antigua, pero el problema subyacente aún no está resuelto. Firefox codifica algo que otros navegadores no tienen.

Fuera de frustración, tuve que crear un enfoque completamente diferente y realmente hacer que el algoritmo sea independiente de si la cadena estaba codificada o no.

espero que esta solución se encuentra aquellos que lo necesitan:

function encodeOnce(text) { 
    var doubleEncoded = encodeURIComponent(text); 
    // only dive into it if there are any encoded strings... 
    if (doubleEncoded.indexOf('%') != -1) { 
    // reverse replace all % signs 
    doubleEncoded = doubleEncoded.replace(/%25/g, '%'); 
    // if this is not equal to the original string, ... 
    if (doubleEncoded != text) { 
     // ... that means there was something to encode 
     text = doubleEncoded; 
    } 
    } 
    return text; 
} 

Así que usted puede hacer esto:

solution = encodeOnce(window.location.hash.slice(1)); 

¿Qué opinas?