2010-11-16 2 views

Répondre

7

la manière évidente de le faire est:

var h = window.location.hash; 
if (h != '' && h != '#all' && h != '#') 
+0

+1. Nice et simple – cobbal

+0

J'ai tendance à utiliser beaucoup de variables locales de cette façon. Cela facilite également le débogage. –

6

vous pouvez utiliser l'opérateur et dans un littéral d'objet:

if (!(window.location.hash in {'':0, '#all':0, '#':0})) 

cela fonctionne en testant les clés de l'objet (les 0 sont juste de remplissage).

Notez également que cela peut casser si vous jouer avec le prototype de object

+0

Une solution à l'aide des tableaux serait plus propre (pas besoin pour les 0s de remplissage), mais IE n'a pas 'indexOf', je suppose que cela vaut mieux –

+0

Avez-vous vraiment besoin de la'! '? Est-ce que les '0 'n'atteignent pas ça? Un rapide [search] (http://snippets.dzone.com/posts/show/6557) a suggéré d'utiliser '1' dans une situation simple" ou ", donc je devine que le' 0' le nierait? –

+0

@Isaac les 0 ne sont pas significatifs, 'in' vérifie simplement les clés. – cobbal

3

Expression régulière? Pas si facile à lire, mais assez concise:

if (/^(|#|#all)$/.test(window.location.hash)) { 
    // ... 
} 

Cela fonctionne aussi:

if (window.location.hash.match(/^(|#|#all)$/)) { 
    // ... 
} 

... mais il est moins efficace, par le commentaire de Ken.

+0

Pour être parfaitement précis, le deuxième exemple devrait utiliser 'search' au lieu de' match', et les deux devraient tester que la valeur == -1. La méthode 'search' de String est comparable à la méthode' test' de RegExp, alors que sa méthode 'match' est comparable à la méthode' exec' de RegExp. 'match' et' exec' sont plus lents mais donnent plus d'informations (ou 'null' sans correspondance), tandis que' search' et 'test' donnent simplement l'index dans la chaîne à laquelle commence la première correspondance (ou -1 sur non rencontre). –

+0

'RegExp.test' renvoie un booléen, pas un index.Je suis d'accord avec le reste de votre commentaire, cependant. Mon deuxième exemple est légèrement inefficace, mais plus lisible que l'alternative que vous proposez - et la brièveté était le point de la question, je suppose. – harto

1

Utilisez indexOf pour les navigateurs plus récents et fournissez une implémentation pour les anciens navigateurs que vous pouvez trouver here.

// return value of -1 indicates hash wasn't found 
["", "#all", "#"].indexOf(window.location.hash) 
1

Juste un ajout, parce qu'en plus d'assez bonne variété de ne vous répétez pas approches, personne n'a mentionné que:

Dans les navigateurs, window est Global objet , donc le couper, si vous n'avez pas avoir une autre propriété nommée "location" dans la portée actuelle (peu probable). location.hash est suffisant

1

Je pense qu'il est bon de vérifier la longueur car le premier caractère est toujours un hachage.

var h = location.hash; 
if (h.length > 1 && h != '#top') 
Questions connexes