2017-06-02 3 views
1

J'ai:revenir à l'état initial lorsque la case Décochez

<label><input type="checkbox" name="all"> text</label> 
<label><input type="checkbox" name="js-frameworks"> text</label> 

const all = document.getElementsByName('all')[0]; 
const jsFrameworks = document.getElementsByName('js-frameworks')[0]; 

this.addEventListener("change", function() { 
    if (all.checked) { 
    jsFrameworks.parentNode.className = 'readonly'; 
    } 
}); 

Je pensais que quand je décochez la case sera supprimé la classe « readonly » que le code exécute seulement quand je coche la case à cocher donnant le si la condition est vraie. Je ne peux pas sembler échapper à la condition if, de sorte à basculer entre le clic et décocher. Comment puis je faire ça?

Merci

+0

essayez d'utiliser même auditeur 'click' au lieu de' 'change' .... change' est plus précis pour' Text' champs ... – Bloomberg58

+0

@ Bloomberg58 et cliquez sur Modifier sont effectivement équivalent pour les cases à cocher, puisque cliquer dessus le change toujours. – Barmar

+0

Pourquoi pensez-vous que la classe sera supprimée? Ne pas ajouter quelque chose n'est pas la même chose que de l'enlever. – Barmar

Répondre

1

Modifier cette façon:

this.addEventListener("change", function() { 
    if (all.checked) { 
    jsFrameworks.parentNode.className = 'readonly'; 
    } else { 
    jsFrameworks.parentNode.className = ''; 
    } 
}); 

De cette façon, vous supprimez la classe quand décochée.

MISE À JOUR:

Ou vous pourriez économiser les classes que votre élément peut avoir avant:

let classesBefore = jsFrameworks.parentNode.className; 
this.addEventListener("change", function() { 
    if (all.checked) { 
    jsFrameworks.parentNode.className = classesBefore + ' readonly'; 
    } else { 
    jsFrameworks.parentNode.className = classesBefore; 
    } 
}); 
+0

Bien que cela fonctionne pour cette situation, il convient de noter que cela supprimera toutes les autres classes qui peuvent être sur le parentNode. – Eggs

-1

Essayez cette

this.addEventListener("click", function() { 
    this.parentNode.toggle('readonly'); 
} 
+0

J'ai essayé classList.toggle() mais il supprime la classe chaque fois que je sélectionne la case à cocher où je veux supprimer la classe lorsque je la désélectionne. La solution de Merunas fonctionne le mieux même si je cherchais un moyen plus efficace de le faire plutôt que d'utiliser –

+0

'toggle()' est une fonction jQuery, et c'est pour cacher et montrer un élément; 'toggleClass()' est pour changer une classe. Mais il n'utilise pas jQuery. – Barmar

0

Essayez ceci.

const all = document.getElementsByName("all")[0]; 
const jsFrameworks = document.getElementsByName("js-frameworks")[0]; 

this.addEventListener("change", function() { 
    if (all.checked) { 
    jsFrameworks.parentNode.classList.add("readonly"); 
    } else if (!all.checked) { 
    jsFrameworks.parentNode.classList.remove("readonly");  
    } 
}); 
+0

Pourquoi devrait-il essayer cela? Expliquez quel était le problème et comment vous l'avez réparé. – Barmar

+0

Vous devriez juste utiliser 'else', puisque'! All.checked' est la seule autre possibilité. – Barmar

+0

@Barmar, ça marche comme je l'ai testé. En réponse à votre deuxième question, j'expliquerai que je suis à l'abri des autres car je ne suis peut-être pas au courant d'autres résultats possibles. Cela semble-t-il raisonnable? – Eggs