Problème window.location.hash dans Firefox

Considérez le code suivant:

hashString = window.location.hash.substring(1); alert('Hash String = '+hashString); 

Lorsqu'il est exécuté avec le hash suivant:

# Voiture = ville% 20% 26% 20 pays

Le résultat de Chrome et Safari sera:

Voiture = ville% 20% 26% 20 pays

Mais dans Firefox (Mac AND PC) sera:

Voiture = ville et pays

Parce que j'utilise le même code pour analyser les paramètres de requête et de hash:

 function parseParams(paramString) { var params = {}; var e, a = /\+/g, // Regex for replacing addition symbol with a space r = /([^&;=]+)=?([^&;]*)/g, d = function (s) { return decodeURIComponent(s.replace(a, " ")); }, q = paramString; while (e = r.exec(q)) params[d(e[1])] = d(e[2]); return params; } 

L'idiosyncrasie de Firefox ici la casse: la voiture s'arrête d'être "Ville", pas de pays.

Existe-t-il un moyen sécurisé d'analyser les paramètres par hash dans les navigateurs ou de réparer la façon dont Firefox les lit?


REMARQUE: ce problème est limité à l'analyse par Firefox des paramètres HASH. Lors de l'exécution du même test avec les chaînes de requêtes:

 queryString = window.location.search.substring(1); alert('Query String = '+queryString); 

Tous les navigateurs afficheront:

Voiture = ville% 20% 26% 20 pays

Une solution de contournement consiste à utiliser

 window.location.toString().split('#')[1] // car=Town%20%26%20Country 

Au lieu de

 window.location.hash.substring(1); 

Puis-je suggérer une méthode différente (je suis plus simple à comprendre l'IMHO)

 function getHashParams() { // Also remove the query string var hash = window.location.toString().split(/[#?]/)[1]; var parts = hash.split(/[=&]/); var hashObject = {}; for (var i = 0; i < parts.length; i+=2) { hashObject[decodeURIComponent(parts[i])] = decodeURIComponent(parts[i+1]); } return hashObject; } 

Cas de test

Url = http://stackoverflow.com/questions/7338373/window-location-hash-issue-in-firefox#car%20type=Town%20%26%20Country&car color=red?qs1=two&qs2=anything

 getHashParams() // returns {"car type": "Town & Country", "car color": "red"} 

window.location.toString().split('#')[1] fonctionnera dans la plupart des cas, mais pas si le hash contient un autre hash (encodé ou non).

En d'autres termes, split('#') peut renvoyer un tableau de longueur> 2. Essayez plutôt (ou la variation propre) à la place:

 var url = location.href; // the href is unaffected by the Firefox bug var idx = url.indexOf('#'); // get the first indexOf '#' if (idx >= 0) { // '#' character is found hash = url.substring(idx, url.length); //the window.hash is the remainder } else { return; // no hash is found... do something sensible }