2017-10-01 8 views
0

私はこの部分的なコードを持っています。これは多くのチェックボックス、ラジオ、隠れたクラスが含まれています。私は知っているように書くことを試みたが、条件リストが長くなると複雑になり、コードを書くのが悪いように見える。だから、私の質問は、クラスをたくさん見せたり隠したりするより良い方法がありますか?そして透明なchexboexとラジオを隠すことですか?前もって感謝します。多くの要素を表示して非表示にし、非表示にチェックボックスをオフにする方が良いでしょうか?

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

なぜjQueryタグですか?私には何も表示されません – j08691

+0

私はjQueryソリューションにもオープンしていることを意味します。 – Saruman

+0

もし一般化されたルールがないのなら、既に書いたコードを守るべきです。 –

答えて

0

あなたが作ることができ、単一の最良の変更は、三項演算子(reference)を利用することだろう。三項演算子は、あなたのスクリプトが重いIf/Else文を書くための効率的な簡略手法です。

三項演算子は、基本的に条件(例えば、IF文)を取り、その条件が真であるときに評価する式と、条件が偽であるときに評価する式を基本的に働かせます。これは、 condition ? expr1 : expr2のように書式設定されています。

コードの6行が一つに凝縮することができ、ちょうどあなたの最初の例を取る:それを超えて

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

... 1行になります...

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

を、私は思いますshowData()関数は任意の値が任意の入力(たとえば頻繁に)で変更されるといつでも呼び出されるので、すべてのDOM参照を格納するキャッシュ&をキャッシュすることをお勧めします。

最後に、style.displayプロパティをblocknoneに連続的に設定するのではなく、非表示または表示する方法としてクラスに要素を追加/削除することをお勧めします。

このCodePenがあなたの元としてJSブロックのほぼ半分のサイズをネッティング、これらの拡張機能のすべてを行います https://codepen.io/anon/pen/YrxeXx

注:現実の世界では、あなたがこれらすべてを宣言したいとは思わないでしょうが私がここで行ったようにグローバル空間の変数は、それは便宜のためだけであった。

+0

詳細な回答ありがとうございます。この行を説明できますか?showData()関数は任意の値が任意の入力(たとえば頻繁に)で変更されたときに呼び出されるため、すべてのDOM参照をキャッシュして格納することをおすすめします。私はそれをかなり理解していませんでした。 – Saruman

関連する問題