2011-01-25 5 views
1

J'ai creusé mon cerveau pour trouver une meilleure solution à la situation suivante. Imaginez une page avec BEAUCOUP de boutons radio, puis une validation personnalisée mettant en évidence les groupes de boutons radio qui n'ont pas été répondus.utiliser jquery pour trouver des groupes de radiobutton sans réponses

exemple html (avec quelques réponses): présélectionnées

<input type='radio' name='a' value='1' /> 
<input type='radio' name='a' value='2' /> 
<input type='radio' name='a' value='3' /> 
<input type='radio' name='b' value='1' checked="checked"//> 
<input type='radio' name='b' value='2' /> 
<input type='radio' name='b' value='3' /> 
<input type='radio' name='c' value='1' /> 
<input type='radio' name='c' value='2' checked="checked"/> 
<input type='radio' name='c' value='3' /> 
<input type='radio' name='d' value='1' /> 
<input type='radio' name='d' value='2' /> 
<input type='radio' name='d' value='3' /> 

Je l'ai déjà écrit un peu de jQuery qui fait ce que je veux, mais je sais que cela peut être fait mieux/plus rapide/plus jolie/plus efficacement.

//select all radiobuttons 
var $radios = $("input[type='radio']") 
//loop through all the radios that are checked 
$($radios+":checked").each(function(){ 
    //filter out all radios with the current name, and add something to recognize them with 
    $($radios).filter("[name='" + $(this).attr("name") + "']").addClass("checked") 
}); 

//find all radios without the class checked, and highlight them 
var $unchecked_radios = $($radios + ":not(.checked)").addClass("highlight"); 

Mais je suis coincé sur la façon de combiner les deux, donc en soustrayant ceux qui ont une réponse de l'ensemble de la population des radios.

(bien que je pense qu'il pourrait y avoir une meilleure façon de sélectionner des groupes de boutons radio avec le même nom)

Toute aide serait grandement appréciée!

Cordialement, Casper

+0

Un objet '{a: faux, b: vrai, c: vrai, d: faux}' fonctionnera-t-il pour vous? –

+0

@salman A, pas vraiment, parce que si je le récupère comme un objet jQuery je peux immédiatement faire d'autres choses avec ça – Koesper

Répondre

2

Je ne sais pas si peut aider, voici un code:

$(document).ready(function() { 
     $('input:not(:checked)').each(function() { 
      if($('input[name='+$(this).attr('name')+']:checked').size() == 0) 
      { 
       $(this).addClass('highlight'); 
      } 
     }); 
    }); 

Avec cela, vous mettez en évidence que la radio non contrôlée des groupes qui n'ont pas de la radio encore vérifié. Est-ce que cela correspond à votre besoin?

+0

Belle approche! Oui, je pense que ça pourrait marcher! permettez-moi de faire un profilage pour voir le gain réel – Koesper

+0

Dans un cas de test simple (100 radios dans 25 groupes) cela prend 18ms, alors que mon ancienne approche a pris 25. Donc, pas une énorme amélioration, mais encore assez important. – Koesper

+0

Je pense qu'il peut y avoir un code plus rapide pour faire le travail (dans mon code, il y a plus de boucles que nécessaire) mais je ne pouvais pas trouver une meilleure solution pour l'instant ... je suis content que cela ait aidé! – Saaman

0

Comment cela?

function is_answered(valueName) 
{ 
    var result=$('input[name='+valueName+']:checked').size(); 
    return result > 0; 
} 
+0

Cela rendrait beaucoup plus facile en effet :-) Mais malheureusement ajouter encore plus d'éléments à mon DOM est un peu hors de portée pour mon projet. merci pour la suggestion cependant! – Koesper

0

Essayez ceci:

var $radios = $("input[type='radio']") 
//loop through all the radios that are checked 
$radios.filter(":checked") 
.each(function(){ 
    //filter out all radios with the current name, and add something to recognize them with 
    $($radios).filter("[name='" + $(this).attr("name") + "']").addClass("checked") 
}) 
.end() 
.filter(":not(.checked)").addClass("highlight"); 

Selon le usecase, cela pourrait être plus agréable:

$("input[type='radio']").filter(":not(:checked)").addClass("highlight"); 

Mais je ne sais pas si vous avez besoin "checked" classe pour autre chose aussi.

+0

Salut Excelian, votre première suggestion donne les résultats que je veux, et en effet, c'est un peu plus agréable car il n'utilise qu'une seule variable jQuery. Je voudrais toujours me débarrasser de la classe «vérifié», puisque je n'en ai pas besoin. – Koesper

Questions connexes