2011-02-24 1 views
1
cas

i ont ce trouble et Ive eu affaire avec mais je ne peux pas tout faire fonctionnerennuis avec SWITCH javascript toujours bien l'exécution par défaut

j'ai cette fonction

function getDirections(dir) 
{ 
var img; 
switch(dir) 
    { 
    case 0: 
    img+='N.png'; 
    break; 
    case 1: 
    img+='NE.png'; 
    break; 
    case 2: 
    img+='E.png'; 
    break; 
    case 3: 
    img+='SE.png'; 
    break; 
    case 4: 
    img+='S.png'; 
    break; 
    case 5: 
    img+='SO.png'; 
    break; 
    case 6: 
    img+='O.png'; 
    break; 
    case 7: 
    img+='NO.png'; 
    break; 
    default: 
    alert('enetered default but direction='+dir); 
    } 
return img; 
} 

droit tout à fait simple? maintenant je ai cet intervalle mis à 5000 ms pour appeler getDirections (variable), la fonction fonctionne bien la première fois son appelé, mais après cela, il entre toujours dans la clause par défaut et il alerte également le 'entrée par défaut mais direction = dirvalue', Je veux dire que même si dir est une valeur comprise entre 0 et 7, elle entrera toujours par défaut: mais elle alerterait la valeur de sorte qu'il était supposé entrer dans l'un des cas.

i fait la même chose en utilisant d'autre si et cela a fonctionné, donc je ne sais pas ce que son mal avec SWITCH

if(dir==0){img+='N.png';} 
else if(dir==1){img+='NE.png';} 
else if(dir==2){img+='E.png';} 
else if(dir==3){img+='SE.png';} 
else if(dir==4){img+='S.png';} 
else if(dir==5){img+='SO.png';} 
else if(dir==6){img+='O.png';} 
else if(dir==7){img+='NO.png';} 
+0

Si vous vous connectez 'dir' en haut de votre fonction, obtenez-vous le résultat attendu? – alex

+0

S'il vous plaît montrer votre minuterie. –

+1

Le code fonctionne bien pour moi dans Firefox, y a-t-il d'autres codes impliqués? Quel navigateur utilisez-vous? Vous pouvez également ajouter 'var img =" ";' car il va essayer de convertir les deux opérandes en une chaîne lors de l'ajout, et comme vous n'avez pas initialisé img, il devient simplement "undefined". :) –

Répondre

6

C'est bizarre ... essayer de faire en sorte que dir est un int, faire avant le commutateur:

dir = parseInt(dir); 

Si l'alerte indique la valeur correctement, il doit entrer dans le commutateur, mais il peut "look" correct mais d'un type de données différent. Faites la conversion manuellement pour vous assurer que c'est un int

+1

ParseInt n'est pas nécessaire. L'opérateur unaire '+' est le chemin à parcourir: 'switch (+ dir) {...' –

+0

bien que vous aviez raison, il semblait que les données récupérées sont des chaînes, donc l'ajout de parseInt a fonctionné ainsi que de changer le cas 1: case '1': – Gustavo

+1

Vous pouvez convertir en int de différentes façons, c'est juste du code:) Je préfère être explicite lors de la conversion plutôt que d'utiliser quelque chose comme + dir que les programmeurs non-javascript (ou débutants) ne pouvaient pas comprendre. – AlfaTeK

0

Difficile à expliquer pourquoi, mais le cas default: également besoin d'une déclaration break; après comme tous les autres cas.

+3

... pas nécessairement, puisque c'est le dernier. C'est toujours une bonne idée de le mettre dans la lisibilité, cependant. –

2

Je suppose que pour une raison quelconque, dir est passé en tant que chaîne. Essayez de changer le cas 1: en cas '1':

2

L'utilisation d'un tableau au lieu d'une chaîne de blocs if/else ou d'une instruction switch géante sera plus rapide, plus flexible et moins sujette aux erreurs. En outre, vous ne devez pas vous inquiéter si dir est un nombre ou une chaîne. Au lieu de:

if(dir==0){img+='N.png';} 
else if(dir==1){img+='NE.png';} 
else if(dir==2){img+='E.png';} 
else if(dir==3){img+='SE.png';} 
else if(dir==4){img+='S.png';} 
else if(dir==5){img+='SO.png';} 
else if(dir==6){img+='O.png';} 
else if(dir==7){img+='NO.png';} 

vous pouvez enregistrer les noms de fichiers dans un tableau:

var images = [ 
    'N.png', 'NE.png', 'E.png', 'SE.png', 'S.png', 'SO.png', 'O.png', 'NO.png' 
]; 

ou sans doute plus lisible:

var images = "N.png NE.png E.png SE.png S.png SO.png O.png NO.png".split(' '); 

puis utilisez simplement:

img = images[dir]; 

Implémentation complète de getDirections usi ng un tableau serait:

var images = "N.png NE.png E.png SE.png S.png SO.png O.png NO.png".split(' '); 
function getDirections(dir) { 
    var img = images[dir]; 
    if (!img) { 
     alert("something"); 
    } 
    return img; 
} 

Cela fonctionne pour vous?

Si images est utilisé uniquement dans une fonction que vous pouvez stocker comme une propriété de la fonction pour éviter la pollution de votre espace de nom comme celui-ci:

function getDirections(dir) { 
    var img = getDirections.images[dir]; 
    if (!img) { 
     alert("something"); 
    } 
    return img; 
} 
getDirections.images = 
    "N.png NE.png E.png SE.png S.png SO.png O.png NO.png".split(' '); 

ou utiliser une fermeture.

+1

assurez-vous d'avoir 'dir' en premier. Ceci est une solution plus propre, mais n'explique toujours pas le problème que rencontre l'utilisateur. :) –

+0

Si le problème est que dir est une chaîne, alors cela fonctionnera de cette façon. Voir ce violon: http://jsfiddle.net/cAg58/ – rsp

+0

1. Il doit être '+ =', pas '='. 2. Vous pouvez supprimer le suffixe '.png' pour supprimer la redondance. Ensuite: 'img + = arr [dir] + '.png';' –

0

Je viens de rencontrer le code dans FireFox/Firebug et a appelé la fonction de cette façon

getDirections(0); 
getDirections('1'); 
getDirections("2"); 

Le premier fait correctement et les deux suivantes entrent default. Ce sont des chaînes de caractères et non des entiers, ce que recherchent les boîtiers. Je ajouté

case "2": 
img+='NO2.png'; 
break; 

et seul le milieu on entrait dans la default. Évidemment, il y a un problème avec la façon dont vous appelez la fonction. Il est probable qu'il passe une chaîne. J'ai aussi utilisé votre if-else bloc (ajouté un else{alert(dir);} et retourné la valeur correcte pour chaque appel.

Javascript peut faire sur la conversion à la volée (je pense qu'il ya un meilleur mot pour cela) entre les cordes et ints (et d'autres) . Cela survient lorsque vous faites le comparrison en utilisant ==. Si vous changez la comparaison dans le ifs-=== vous obtenez le même comportement que le bloc switch.

0

Je collais votre code dans un fichier HTML et couru avec le boutons suivants:

<button onclick="alert(getDirections(2))">Switch/Int</button> 
<button onclick="alert(getDirections('2'))">Switch/String</button> 
<button onclick="alert(getDirections2(2))">If-Else/Int</button> 
<button onclick="alert(getDirections2('2'))">If-Else/String</button> 

Lors de l'appel de la version de commutateur avec un 2 ordinaire, cela fonctionne comme prévu. L'appeler avec '2' le fait passer à la ligne default. La version if-else fonctionne comme prévu dans les deux cas. Donc, le problème est probablement que switch ne fait pas une conversion implicite et == fait.

3

Je sais que je suis un peu en retard à la fête, mais je pensais que cela pourrait être important pour quiconque ne comprend pas pourquoi le «si» a fonctionné et le commutateur n'a pas fonctionné. Il est probable que personne ne lira cette réponse, mais je l'ai trouvé en cherchant quelque chose d'autre, alors peut-être que quelqu'un va-il été utile de toute façon:

Votre commutateur est le suivant:

function getDirections(dir) { 
    var img; 
    switch(dir) { 
     case 0: 
      img+='N.png'; 
      break; 
     case 1: 
      img+='NE.png'; 
      break; 
     case 2: 
      img+='E.png'; 
      break; 
     case 3: 
      img+='SE.png'; 
      break; 
     case 4: 
      img+='S.png'; 
      break; 
     case 5: 
      img+='SO.png'; 
      break; 
     case 6: 
      img+='O.png'; 
      break; 
     case 7: 
      img+='NO.png'; 
      break; 
     default: 
      alert('enetered default but direction='+dir); 
    } 
    return img; 
} 

Ce n'est pas la même chose que une série de doubles égaux (==) mais une série de triple égaux (===). Il serait équivalent à:

if (dir === 0) { 
    img+='N.png'; 
} else if (dir === 1) { 
    img+='NE.png'; 
} else if (dir === 2) { 
    img+='E.png'; 
} else if (dir === 3) { 
    img+='SE.png'; 
} else if (dir === 4) { 
    img+='S.png'; 
} else if (dir === 5) { 
    img+='SO.png'; 
} else if (dir === 6) { 
    img+='O.png'; 
} else if (dir === 7) { 
    img+='NO.png'; 
} else { 
    alert('enetered default but direction='+dir); 
} 

Dans le monde de « == », l'entier 2 est le même que la chaîne « 2 », mais pas dans le pays de « === ».

Questions connexes