Изменение стиля Чекбокса (Checkbox JS)

174
19 апреля 2022, 13:40

Помогите, пожалуйста Делается тест, в рамках которого после нажатия кнопки происходит проверка корректности ответа и правильные ответы выделяются зеленым, а неправильные - красным.

Необходимо поменять данную ситуацию таким образом, чтобы только отмеченные чекбоксы показывали правильный это ответ или нет

(например, выбран 1 и 3, выделяются 1 как неправильно и 3 как правильно)

Есть код Часть HTML разметки:

             <div class="test" id="m1_q1">
                 <p>Вопрос 1</p>
                     <div class="answer-1">
                            <input type="checkbox" class="wrong_1" name="customCheck1" id="customCheck_m1_q1_a1">
                            <label class="wrong_1" for="customCheck_m1_q1_a1">
                        <p class="answer-wrong">неверный ответ</p>
                     </label>
                        </div>
                        <div class="answer-1">
                            <input type="checkbox" class="wrong_1" name="customCheck1" id="customCheck_m1_q1_a2">
                            <label class="wrong_1" for="customCheck_m1_q1_a2">
                        <p class="answer-wrong">неверный ответ</p>
                     </label>
                        </div>
                        <div class="answer-1">
                            <input type="checkbox" class="wright_1" name="customCheck1" id="customCheck_m1_q1_a3">
                            <label class="wright_1" for="customCheck_m1_q1_a3">
                        <p class="answer-wright">верный ответ</p>
                     </label>
                        </div>
                        <div class="answer-1">
                            <input type="checkbox" class="wright_1" name="customCheck1" id="customCheck_m1_q1_a4">
                            <label class="wright_1" for="customCheck_m1_q1_a4">
                        <p class="answer-wright">верный ответ</p>
                     </label>
                        </div>
                        <button class="btn-check" onclick="CheckAnswer1();">Проверить ответ</button>
             </div>

JS:

const btnCheckAnswer = document.querySelectorAll('.btn-check'),
      WrightAnswers = document.querySelectorAll('.answer-wright'),
      WrongAnswers = document.querySelectorAll('.answer-wrong');
scoreM1 = 0;
function CheckAnswer1() {
    
    const answer1 = document.querySelectorAll('.answer-1');
    let counts = $("input.wright_2:checked").length;
if ($("input.wrong_1").is(':checked')) {
        for (let i = 0; i < answer1.length; i++) {
            answer1[i].classList.add('disabled');
        }
        btnCheckAnswer[0].classList.add('disabled');
        WrightAnswers[0].classList.add('color-green-100');
        WrightAnswers[1].classList.add('color-green-100');
        WrongAnswers[0].classList.add('color-red-100');
        WrongAnswers[1].classList.add('color-red-100');
        return;
    } else if (counts == 2) {
        for (let i = 0; i < answer1.length; i++) {
            answer1[i].classList.add('disabled');
        }
        btnCheckAnswer[0].classList.add('disabled');
        WrightAnswers[0].classList.add('color-green-100');
        WrightAnswers[1].classList.add('color-green-100');
        WrongAnswers[0].classList.add('color-red-100');
        WrongAnswers[1].classList.add('color-red-100');
        scoreM1 += 1;
        return;
    } else if (counts > 0 && counts < 2) {
        for (let i = 0; i < answer1.length; i++) {
            answer1[i].classList.add('disabled');
        }
        
        btnCheckAnswer[0].classList.add('disabled');
        WrightAnswers[0].classList.add('color-green-100');
        WrightAnswers[1].classList.add('color-green-100');
        WrongAnswers[0].classList.add('color-red-100');
        WrongAnswers[1].classList.add('color-red-100');
        return;
    } else {
        alert('Выбери ответ!');
    }
}

В СSS просто прописаны стили, в частности

.color-red-100 {
color:red;
text-decoration:line-through;
}
.color-green-100 {
color:green;
}

Заранее большое спасибо=)

Answer 1

Самый простой способ вам помочь - задействовать стили только для лейблов, находящихся после зачекнутых чекбоксов. Понадобятся только минимальные изменения в CSS:

.answer-1 input:checked + label .color-red-100 {
  color: red;
  text-decoration: line-through;
}
.answer-1 input:checked + label .color-green-100 {
  color: green;
}

Ну а по-хорошему, надо это ваше скриптовое безобразие переписать, убрав ошибки и оптимизировав код.

const btnCheckAnswer = document.querySelectorAll('.btn-check'),
  WrightAnswers = document.querySelectorAll('.answer-wright'),
  WrongAnswers = document.querySelectorAll('.answer-wrong');
scoreM1 = 0;
function CheckAnswer1() {
  const answer1 = document.querySelectorAll('.answer-1');
  let counts = $("input.wright_2:checked").length;
  if ($("input.wrong_1").is(':checked')) {
    for (let i = 0; i < answer1.length; i++) {
      answer1[i].classList.add('disabled');
    }
    btnCheckAnswer[0].classList.add('disabled');
    WrightAnswers[0].classList.add('color-green-100');
    WrightAnswers[1].classList.add('color-green-100');
    WrongAnswers[0].classList.add('color-red-100');
    WrongAnswers[1].classList.add('color-red-100');
    return;
  } else if (counts == 2) {
    for (let i = 0; i < answer1.length; i++) {
      answer1[i].classList.add('disabled');
    }
    btnCheckAnswer[0].classList.add('disabled');
    WrightAnswers[0].classList.add('color-green-100');
    WrightAnswers[1].classList.add('color-green-100');
    WrongAnswers[0].classList.add('color-red-100');
    WrongAnswers[1].classList.add('color-red-100');
    scoreM1 += 1;
    return;
  } else if (counts > 0 && counts < 2) {
    for (let i = 0; i < answer1.length; i++) {
      answer1[i].classList.add('disabled');
    }
    btnCheckAnswer[0].classList.add('disabled');
    WrightAnswers[0].classList.add('color-green-100');
    WrightAnswers[1].classList.add('color-green-100');
    WrongAnswers[0].classList.add('color-red-100');
    WrongAnswers[1].classList.add('color-red-100');
    return;
  } else {
    alert('Выбери ответ!');
  }
}
.answer-1 input:checked+label .color-red-100 {
  color: red;
  text-decoration: line-through;
}
.answer-1 input:checked+label .color-green-100 {
  color: green;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="test" id="m1_q1">
  <p>Вопрос 1</p>
  <div class="answer-1">
    <input type="checkbox" class="wrong_1" name="customCheck1" id="customCheck_m1_q1_a1">
    <label class="wrong_1" for="customCheck_m1_q1_a1">
                        <p class="answer-wrong">неверный ответ</p>
                     </label>
  </div>
  <div class="answer-1">
    <input type="checkbox" class="wrong_1" name="customCheck1" id="customCheck_m1_q1_a2">
    <label class="wrong_1" for="customCheck_m1_q1_a2">
                        <p class="answer-wrong">неверный ответ</p>
                     </label>
  </div>
  <div class="answer-1">
    <input type="checkbox" class="wright_1" name="customCheck1" id="customCheck_m1_q1_a3">
    <label class="wright_1" for="customCheck_m1_q1_a3">
                        <p class="answer-wright">верный ответ</p>
                     </label>
  </div>
  <div class="answer-1">
    <input type="checkbox" class="wright_1" name="customCheck1" id="customCheck_m1_q1_a4">
    <label class="wright_1" for="customCheck_m1_q1_a4">
                        <p class="answer-wright">верный ответ</p>
                     </label>
  </div>
  <button class="btn-check" onclick="CheckAnswer1();">Проверить ответ</button>
</div>

READ ALSO
Добавить input в форму при клике

Добавить input в форму при клике

Есть несколько блоков такого вида:

263
Передача параметров PHP из jquery step basic в скрипт

Передача параметров PHP из jquery step basic в скрипт

Установил базовый скрипт jquery step basic example

241
Вернуть из jquery-запроса html код с php-бека

Вернуть из jquery-запроса html код с php-бека

Есть такой кодОн отправляет запрос на бекенд, который должен вернуть просто html-код, что он и делает:

163