2011-04-19 5 views
-1

J'ai un problème avec ma fonction JS. Je vais vous expliquer cela avec mon code et un Prt Sc.Désactiver plusieurs cases à cocher avec javascript

Code = http://jsfiddle.net/dKeRf/

Ceci est une fonction Php et la fonction JS.

écran = http://img824.imageshack.us/i/antoe.png/

Si l'un des deux case à cocher sur la table est cochée, la case à cocher dans le tableau deux doit être désactivé. Pour le moment Cela fonctionne pour la première case, mais pas pour la seconde, et je vous demande pourquoi? :)

J'utilise « 10 » dans mon « Pour » saillir pour un test, je vais changer ce dernier par le nombre de lignes de la table.

Merci pour votre aide et ont une bonne journée!

+2

code Coller ici au lieu de sources externes. Et n'oubliez pas d'effacer sa syntaxe parce que personne n'aime lire le code désordonné. – hsz

+0

s'il vous plaît nettoyer votre code – jimy

Répondre

1

Ajouter une classe à toutes les cases à cocher:

<input class="the_checkbox" id='{unique_id}' name='module[]' type='checkbox' value='{unqiue_value}'> 
<input class="the_checkbox" id='{unique_id}' name='module[]' type='checkbox' value='{unqiue_value}'> 
<input class="the_checkbox" id='{unique_id}' name='module[]' type='checkbox' value='{unqiue_value}'> 
<input class="the_checkbox" id='{unique_id}' name='module[]' type='checkbox' value='{unqiue_value}'> 

Utilisez ensuite jquery pour mettre à jour toutes les cases à la fois:

<script> 
$(document).ready(function(){ 
    $(".selectAll").click(function() { 
     if($(".selectAll").attr("checked")) { 
      $(".the_checkbox:checkbox").attr("disabled", true); 
     } else { 
      $(".the_checkbox:checkbox").removeAttr("disabled"); 
     } 
    });   
}); 
</script> 

MISE À JOUR: Modifie la réponse à utiliser. nom de classe pour mettre à jour les cases à cocher au lieu de l'ID afin que l'ID puisse rester unique et conforme aux normes HTML.

+0

Merci pour votre réponse! Mais la case à cocher ne peut pas avoir le même identifiant, cela ne fonctionne pas. Je vais essayer d'utiliser jQuery, ça m'aidera peut-être. Je vais aussi nettoyer mon code et le poster. –

+0

Je ne sais pas ce que vous voulez dire par "ça ne marche pas" avec tous les mêmes ID. Y a-t-il autre chose que vous faites avec l'ID qui les oblige à être tous différents? Sinon, cela fonctionnera. Je l'ai testé, donc je sais que ça fonctionnera avec tous les mêmes ID. Suivez mon exemple ci-dessus. Cochez la case qui désactive toutes les autres cases à cocher de la classe selectAll (class = "selectAll") et cochez les cases qui doivent être désactivées l'ID de cpt2 (id = "cpt2") et utilisez le code jquery que j'ai posté. . –

+0

Je voudrais vraiment suggérer contre cela. Selon la spécification HTML, les identifiants doivent être uniques. Bien que oui, JQuery fonctionnera toujours, document.getElementById() ne fonctionnera pas. Et si vous voulez apprendre le JavaScript et vous libérer de la dépendance sur JQuery, vous aurez besoin de document.getElementById(). –

1

ID ne sont pas autorisés à commencer par un certain nombre, ils doivent commencer par une lettre. Donc document.getElementById(1234) va échouer (je pense que IE pourrait ne rien dire et l'autoriser, mais FF ne fonctionne pas). Vous devriez accepter de simplement mettre une lettre devant le numéro et changer le getElementById en document.getElementById('cb'+id2);.

En outre, juste une note de côté, si vous passez en this à une fonction onClick, ce paramètre est une référence à l'élément qui a été cliqué. Donc, il n'est pas nécessaire d'obtenir box.id, puis faites document.getElementById(checkId). techniquement document.getElementById(checkId) est === box vous pourriez donc juste dire box.checked.

http://www.w3.org/TR/html4/types.html#h-6.2. Ceci est la spécification qui parle au sujet des exigences de nommage des attributs ID:

jetons d'identité et le nom doit commencer par une lettre ([A-Za-z]) et peut être suivi par un certain nombre de lettres, de chiffres ([0 -9]), les traits d'union ("-"), les traits de soulignement ("_"), les deux-points (":") et les points (".").

Edit:

Encore mieux que d'utiliser document.getElementById() pour sélectionner chaque case à cocher, serait d'utiliser document.getElementById() sur un élément parent que les cases que vous souhaitez désactiver la part (comme la table, ils sont) puis utilisez document.getElementsByTagName('input') pour obtenir une collection de toutes les cases à cocher et les boucler/les désactiver avec cela.Ainsi, le code de désactivation JS ressemblerait à ceci:

Certaines table:

<input type='checkbox' onClick='checkCBs(this,"someTable1");'> 
<table id='someTable1'> 
    <tr> 
    <td>This is checkbox 1:</td> 
    <td><input type='checkbox' name='group1' value='checkbox1'></td> 
    </tr> 
    <tr> 
    <td>This is checkbox 2:</td> 
    <td><input type='checkbox' name='group1' value='checkbox2'></td> 
    </tr> 
</table> 

Le code:

function checkCBs(box, parent){ 
    var parent = document.getElementById(parent), 
     CBs = parent.getElementsByTagName('input'), 
     i; 
    //loop through all input elements 
    for(i=0;i<CBs.length;i++){ 
     //make sure the input is a checkbox 
     if(CBs[i].type && CBs[i].type=='checkbox'){ 
      //set disabled on this checkbox to opposite 
      //of whether box is checked. 
      CBs[i].disabled = !box.checked; 
     } 
    } 

} 
+0

Cela semble être le début d'une solution élégante. Y at-il de toute façon pour éliminer la boucle for? Sinon, au moins pour de meilleures performances (même si elles peuvent être petites), le CBs.length devrait être un var défini avant la boucle for afin que vous n'ayez pas à appeler la fonction 'length' pour chaque itération dans la boucle. –

+0

correct, le CBs.length devrait être placé avant la boucle, j'étais juste paresseux. Quant à la boucle 'for', elle est requise. DOM n'a aucun moyen d'affecter plusieurs éléments dans un collection/objet/tableau sans les parcourir et affecter chaque valeur individuelle. Même dans JQuery, vous l'appelez avec un appel de fonction, mais il continue de parcourir ces éléments et de les affecter individuellement. Vous pouvez écrire une fonction pour le faire pour vous (même chose que d'utiliser jquery) mais il n'y a probablement pas beaucoup d'avantages. –

+0

Merci pour votre aide Jonathan, cdburgess et afuzzyllama, je vais essayer la solution de Jonathan pour résoudre mon problème! Parent.getElementsByTagName semble être un très bon moyen de le faire. Je vous remercie ! –

Questions connexes