2011-01-29 6 views
14

Sto avendo frustrazione tra Firefox e IE, per lo più Firefox in quanto decodifica automaticamente un parametro nell'hash prima che io possa lavorare con esso in Javascript. IE non decodifica automaticamente l'URL quindi non mi dà errori di lettura.Firefox decodifica automaticamente il parametro codificato in url, non succede in IE

Il mio problema è simile a questo, tranne che non sto usando ASP.NET ASP.NET MVC automatically decoding JSON-encoded parameters from AJAX

Quindi, se prendo un url del tipo example.com/#question=!%40%23%24%25^%26*(

mentre il "!% 40% 23% 24% 25%^26 * ("è stato codificato utilizzando encodeURIComponent, in IE quando accedo all'hash verrà lasciato come"!% 40% 23% 24% 25 ^% 26 * (", tuttavia in firefox, quando accedo all'hash è automaticamente decodificato in "! @ # $%^& * ("

Il problema con questo è che nel mio script sto usando decodeURIComponent per decodificare il valore codificato, w che va bene se la stringa è effettivamente codificata. Poiché è già decodificato in Firefox, mi dà un errore di sequenza URI non valido, e IE non mi dà alcun errore.

Come posso risolvere questo problema?

risposta

19

Dopo la ricerca ho scoperto che questo è un problema cross browser, ed è meglio usare location.href.split("#")[1] invece di window.location.hash

+0

Grazie mille per questo. Ho appena avuto lo stesso problema in Fx (Chrome va bene) e location.href.split ("#!") [1] ha funzionato anche per me. – meloncholy

+1

Non sembra che Firefox risolverà questo in qualunque momento presto. Stanno discutendo del bug dal 2002 :(https://bugzilla.mozilla.org/show_bug.cgi?id = 135309 e https://bugzilla.mozilla.org/show_bug.cgi?id=483304 – gregers

+0

Firefox sta consentendo "#" all'interno della stringa hash, quindi potrebbe essere più a prova di proiettili per così 'window.location.hash.split ("#"). splice (1) .join ("#") '. – fourthnen

1

Questo è in realtà ciò che si desidera utilizzare:

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

Infatti finestra. location.href.split ("#!") [1] non viene decodificato da FF automaticamente (almeno oggi).

+0

'window.location.hash' è in realtà la radice del problema, quindi non funzionerà. Ma è come dovrebbe * essere * stato ... – gregers

0

La risposta sopra funziona, ad eccezione dei casi in cui l'url contiene più di un #. Questo dovrebbe gestire tutti i casi:

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

Inoltre, sembra che questo dovrebbe essere risolto in Firefox a breve. Basta premere il nightlies:

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

0

ho avuto questo problema. L'ho risolto con questa soluzione:

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

Questa è una domanda molto vecchia, ma il problema di fondo non è ancora risolto. Firefox codifica qualcosa che altri browser non fanno.

Per frustrazione, ho dovuto creare un approccio completamente diverso e in effetti rendere l'algoritmo indipendente dal fatto che la stringa fosse codificata o meno.

Spero che questa soluzione trova chi ne ha bisogno:

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; 
} 

Così allora si può fare questo:

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

Cosa ne pensi?

Problemi correlati