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 }