sample: quiz by using checkbox

by sii_side

HTML

<fieldset>
  <legend>Q1. パ・リーグのチームを選びなさい。</legend>

  <p>
    <!-- 独自属性としてdata-answerを付与 0:不正解 1:正解 -->
    <label><input type="checkbox" data-answer="1">福岡ソフトバンクホークス</label>
    <label><input type="checkbox" data-answer="0">阪神タイガース</label>
    <label><input type="checkbox" data-answer="1">埼玉西武ライオンズ</label>
    <label><input type="checkbox" data-answer="0">広島東洋カープ</label>
  </p>

  <input type="button" onclick="checkAnswer(this.parentNode);" value="解答">
</fieldset>

<fieldset>
  <legend>Q2. 九州の県を選びなさい。</legend>

  <p>
    <label><input type="checkbox" data-answer="1">佐賀県</label>
    <label><input type="checkbox" data-answer="0">岡山県</label>
    <label><input type="checkbox" data-answer="1">長崎県</label>
    <label><input type="checkbox" data-answer="0">千葉県</label>
    <label><input type="checkbox" data-answer="1">福岡県</label>
  </p>

  <input type="button" onclick="checkAnswer(this.parentNode);" value="解答">
</fieldset>

JavaScript

//fieldset: 押したボタンの親(fieldset要素)
function checkAnswer(fieldset) {
  //選択肢のチェックボックスを参照
  var cbox = fieldset.querySelectorAll("input[type=checkbox]");

  //正解・不正解を管理するフラグ
  //true(正解)で始め、1つでも問題があればfalse(不正解)にする
  var flag = true;

  //不正解時に正解を表示させるため、正解を集めるための配列
  var ans = [];

  for(var i = 0; i < cbox.length; i++) {
    if(cbox[i].dataset.answer === "1") {          //選択肢が正解の場合は、
      ans.push(cbox[i].parentNode.textContent);   //選択肢を配列に入れる
      if(cbox[i].checked === false) {             //正解なのにチェックされていない場合、
        flag = false;                             //フラグをfalseにする
      }
    }
    else if(cbox[i].dataset.answer === "0") {     //選択肢が不正解の場合は、
      if(cbox[i].checked === true) {              //チェックされていた場合に、
        flag = false;                             //フラグをfalseにする
      }
    }
  }

  if(flag === true) {  //正解だった場合
    window.alert("正解!");
  }
  else if(flag === false) {  //不正解だった場合
    window.alert("不正解!\n\n正解:" + ans.join(", "));  //正解も表示
  }
}