2017-10-01 2 views
0

J'ai ce code partiel et comme vous le voyez Il comprend beaucoup de cases à cocher, radios et classes cachées. J'ai essayé d'écrire comme je le sais, mais quand les listes de conditions s'allongent, ça devient compliqué et ça a l'air d'une mauvaise façon d'écrire du code. Donc, ma question est, Y at-il une meilleure façon de montrer et de cacher beaucoup de classes et de cacher les chexboex et les radios? Merci d'avance.Yat-il un meilleur moyen d'afficher et de masquer beaucoup d'éléments et de décocher les cases à cocher sur hide?

function showData() { 
 
    if (relativeYes.checked) { 
 
    document.getElementById('relativeConditions').style.display = 'block'; 
 
    
 
    } else { 
 
    document.getElementById('relativeConditions').style.display = 'none'; 
 
    } 
 
    if (relativeNo.checked) { 
 
    document.getElementById('verification').style.display = 'block'; 
 
    } 
 
    else { 
 
    document.getElementById('verification').style.display = 'none'; 
 
    } 
 
    
 
    if (no.checked) { 
 
    document.getElementById('output').innerHTML = 'Nope'; 
 
    document.getElementById('gender').style.display = 'none'; 
 
    } 
 
    else { 
 
    document.getElementById('output').innerHTML = ''; 
 
    } 
 
    if (yes.checked) { 
 
    document.getElementById('profiling').style.display = 'block'; 
 
    } 
 
    else { 
 
    document.getElementById('profiling').style.display = 'none'; 
 
    } 
 
    if (profilingYes.checked) { 
 
    document.getElementById('output').innerHTML = 'DO'; 
 
    document.getElementById('secondPart').style.display = 'none'; 
 
    } else { 
 
    document.getElementById('secondPart').style.display = 'block'; 
 
    } 
 
    if (profilingNo.checked) { 
 
    document.getElementById('gender').style.display = 'block'; 
 
    } 
 
    if (yes.checked && male.checked) { 
 
    document.getElementById('maleDiagnosis').style.display = 'block'; 
 
    } else { 
 
    document.getElementById('maleDiagnosis').style.display = 'none'; 
 
    } 
 
    if (yes.checked && female.checked) { 
 
    document.getElementById('femaleDiagnosis').style.display = 'block'; 
 
    } 
 
    else { 
 
    document.getElementById('femaleDiagnosis').style.display = 'none'; 
 
    } 
 
    if (maleMlm.checked === true && maleDiagnosis.style.display == 'block') { 
 
    document.getElementById('output').innerHTML = 'DO'; 
 
    } 
 
    
 
    else if (malePrt.checked) { 
 
    document.getElementById('output').innerHTML = 'OTHER'; 
 
    
 
    } 
 
    if (malePn.checked === true && maleMlm.checked === false) { 
 
    document.getElementById('jaw').style.display = 'block' 
 
    } 
 
    
 
    else { 
 
    document.getElementById('jaw').style.display = 'none' 
 
    } 
 
    if (maleMlm.checked === false && malePn.checked === true && malePrt.checked === true) { 
 
    document.getElementById('output').innerHTML = ''; 
 
    } 
 
    if (jawYes.checked) { 
 
    document.getElementById('output').innerHTML = 'DO'; 
 
    } 
 
    else if (jawNo.checked) { 
 
    document.getElementById('output').innerHTML = 'OTHER'; 
 
    } 
 
    
 
    if ((maleMlm.checked || malePrt.checked || malePn.checked) && maleDiagnosis.style.display == 'none') { 
 
    maleMlm.checked = maleMlm.unchecked; 
 
    malePrt.checked = malePrt.unchecked; 
 
    malePn.checked = malePn.unchecked; 
 
    } 
 
    if ((jawYes.checked || jawNo.checked) && document.getElementById('jaw').style.display == 'none') { 
 
    jawYes.checked = jawYes.unchecked; 
 
    jawNo.checked = jawNo.unchecked; 
 
    } 
 
    if ((profilingNo.checked || profilingYes.checked) && profiling.style.display == 'none') { 
 
    profilingNo.checked = profilingNo.unchecked; 
 
    profilingYes.checked = profilingYes.unchecked; 
 
    
 
    } 
 
    
 

 
} 
 
    
 
function clearRadios(id) { 
 
    var Radios = document.getElementById(id).getElementsByTagName('input'); 
 
    for (var i = 0; i < Radios.length; i++) { 
 
    if (Radios[i].type == 'radio') { 
 
     Radios[i].checked = false; 
 
    } 
 
    } 
 
} 
 
    
 

 
    
 
document.getElementById('container').addEventListener('change', showData);
#jaw, 
 
#age, 
 
#profiling, 
 
#secondPart, 
 
#verification, 
 
#maleDiagnosis, 
 
#femaleDiagnosis, 
 
#relativeConditions, 
 
#gender { 
 
    display: none; 
 
}
<body> 
 
    
 
    <div id="container" onchange="showData();"> 
 
    
 
    <div id="relative"> 
 
    
 
     Lorem ipsum dolor, sit amet consectetur adipisicing elit. Eaque, laboriosam ? 
 
     Yes<input id="relativeYes" type="radio" name="relative" onchange="clearRadios('none')"> 
 
     No<input id="relativeNo" type="radio" name="relative"> 
 
    
 
    </div> 
 
    
 
    <div id="relativeConditions"> 
 
     1. Lorem ipsum dolor sit amet consectetur, adipisicing elit. <input type="radio" name="relaiveConditionsCheck"><br> 
 
     2. Lorem ipsum dolor sit.****<input type="radio" name="relaiveConditionsCheck"><br> 
 
     3. Lorem ipsum dolor sit amet consectetur.<input type="radio" name="relaiveConditionsCheck"><br> 
 
     4. Lorem ipsum dolor sit amet consectetur adipisicing.<input type="radio" name="relaiveConditionsCheck"> 
 
    
 
    </div> 
 
    
 
    <div id="none"> 
 
    
 
     <div id="verification"> 
 
    
 
     Lorem ipsum dolor sit?<br> 
 
     Yes <input id="yes" type="radio" name="verification"> 
 
     No<input id="no" type="radio" name="verification"><br> 
 
    
 
     </div> 
 
    
 
     <div id="profiling"> 
 
    
 
      Lorem ipsum dolor sit amet ? 
 
     Yes<input id="profilingYes" name="profiling" type="radio"> 
 
     No<input id="profilingNo" name="profiling" type="radio"> 
 
    
 
     </div> 
 
    
 
     <div id="secondPart"> 
 
    
 
     <div id="gender"> 
 
    
 
      GEnder: 
 
      Male</label><input id="male" type="radio" name="gender" > 
 
      Female</label> <input id="female" type="radio" name="gender" ><br> 
 
    
 
     </div> 
 
     <div id="maleDiagnosis"> 
 
      Mlm<input id="maleMlm" type="checkbox"> 
 
      Prt <input id="malePrt" type="checkbox"> 
 
      Pn<input id="malePn" type="checkbox" ><br> 
 
    </div> 
 
    
 
    <p id="jaw"> 
 
    
 
     Lorem ipsum dolor sores? 
 
     Yes<input id="jawYes" type="radio" name="jaw"> 
 
     No<input id="jawNo" type="radio" name="jaw"> 
 
    
 
     </p> 
 
    
 
    <div id="femaleDiagnosis" > 
 
    Mm<input type="checkbox"> 
 
    Or<input type="checkbox"> 
 
    Pan<input type="checkbox"><br> 
 
    </div> 
 
    
 
</div> 
 
    
 
</div> 
 
    
 
<span style="color:red">Output:</span><span id="output"> </span> 
 
</div> 
 
    
 
</body>

+1

Pourquoi le tag jQuery? Je ne vois pas – j08691

+0

Cela signifie que je suis ouvert aux solutions jQuery aussi. – Saruman

+0

Si j'ai raison de dire qu'il n'y a pas de règles généralisées, alors vous devriez vous en tenir au code que vous avez déjà écrit. –

Répondre

0

Le meilleur seul changement que vous pourriez faire serait d'utiliser l'opérateur ternaire (reference). L'opérateur ternaire est une approche efficace pour écrire des instructions If/Else, sur lesquelles votre script est lourd. L'opérateur ternaire fonctionne essentiellement en prenant d'abord une condition (par exemple votre instruction IF), suivie d'une expression pour évaluer quand cette condition est vraie et enfin quelle expression évaluer quand la condition est fausse. Ceci est stylisé comme: condition ? expr1 : expr2.

Prendre simplement votre premier exemple, que six lignes de code peuvent être condensés en un seul:

if (relativeYes.checked) { 
    document.getElementById('relativeConditions').style.display = 'block'; 
    } 
else { 
    document.getElementById('relativeConditions').style.display = 'none'; 
    } 

... devient une ligne ...

relativeYes.checked ? document.getElementById('relativeConditions').style.display = 'block' : document.getElementById('relativeConditions').style.display = 'none'; 

Au-delà, je recommande la mise en cache & en stockant toutes vos références DOM, puisque votre fonction showData() est appelée chaque fois qu'une valeur est modifiée dans une entrée (par exemple fréquemment).

Enfin, il est généralement recommandé d'ajouter/supprimer des classes à un élément comme un moyen de cacher ou montrer, par opposition à la mise en permanence la propriété style.display-block et none.

Ce CodePen fait toutes ces améliorations, un bloc de compensation JS près de la moitié de la taille que l'original: https://codepen.io/anon/pen/YrxeXx

NOTE: Dans le monde réel, vous ne voudriez pas déclarer tous ces variables dans l'espace global comme je l'ai fait ici, c'était seulement pour l'opportunité.

+0

Merci pour la réponse détaillée. Pouvez-vous expliquer cette ligne "Je vous recommande de mettre en cache et de stocker toutes vos références DOM, puisque votre fonction showData() est appelée à chaque fois qu'une valeur est modifiée dans une entrée (par exemple fréquemment).". Je ne l'ai pas bien compris. – Saruman