2010-11-30 5 views
0

J'ai un code comme celui-ci pour voir si certains boutons radio ont été vérifiés ou non. J'utilise .each fonction de jquery pour afficher une alerte quand je trouve un groupe de boutons radio avec la même valeur de nom et aucun d'eux n'a été vérifié. Quand j'en trouve un, je veux déclencher une alerte et renvoyer false, mais après l'affichage de l'alerte, l'exécution du .each s'arrête mais les lignes après la fonction .each sont exécutées (je veux dire que la vraie valeur est exécutée).Éviter l'exécution continue dans une boucle .each

$(":radio").each(function(){ 
    var name = $(this).attr('name'); 
    var numAnswered = $(":radio").filter('[name='+name+']').filter(":checked").length; 
    var notAnswered = numAnswered == 0; 
    if(notAnswered){ 
     alert("Must answer all questions"); 
     return false; 
    } 
}); 
console.log('still goes here even when alert is fired'); 
return true; 

Comment puis-je éviter cette situation?

Merci.

+0

Etes-vous groupe de boutons radio dans un autre conteneur de tri? Il serait beaucoup plus efficace de faire une boucle de cette façon, comme '$ (". Container "). Each (...' alors vérifiez '$ (this) .find (": radio: checked "). Length', you ' –

+0

@Nick Craver Je sais que ce serait plus efficace, mais je ne veux pas que cette fonction dépende de la façon dont les boutons radio sont affichés sur le html car il peut être changé plus tard et il peut y avoir être plus qu'un "groupe radio" dans le même conteneur – Javi

+0

Tant qu'ils sont dans un conteneur de * un * type que vous pouvez identifier, vous pouvez le rendre * beaucoup * plus efficace, même si vous avez fait $ (" : radio "). nearest (" div "). chaque (...)' pour le rendre agnostique par exemple –

Répondre

1
var myreturnvalue = true; 
$(":radio").each(function(){ 
    var name = $(this).attr('name'); 
    var numAnswered = $(":radio").filter('[name='+name+']').filter(":checked").length; 
    var notAnswered = numAnswered == 0; 
    if(notAnswered){ 
     alert("Must answer all questions"); 
     myreturnvalue = false; 
     return false; 
    } 
}); 
console.log('still goes here even when alert is fired'); 
return myreturnvalue; 
1

Vous pouvez utiliser cette même notAnswered variable (ou une autre, quelle que soit flotte votre bateau) à une portée supérieure, comme ceci:

var notAnswered; 
$(":radio").each(function(){ 
    notAnswered = $(":radio[name="+this.name+"]:checked").length == 0; 
    if(notAnswered){ 
     alert("Must answer all questions"); 
     return false; 
    } 
}); 
if(notAnswered) return false; 
console.log("will only fire if there's an answer"); 
return true; 

Les autres changements ci-dessus sont juste amincissant le code, vous pouvez vous avec beaucoup moins d'invocations de moteur de sélection :)

Questions connexes