Отображать сообщение, когда некоторые или все флажки не отмечены - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть эта страница с несколькими флажками, и при нажатии появляется элемент.

У меня есть эта урезанная версия, чтобы показать ее просто:

<!DOCTYPE html>
<html>
<body>

<p>Display some text when the checkbox is checked:</p>

Checkbox 1: <input type="checkbox" id="check1"  onclick="box1()"><br>
Checkbox 2: <input type="checkbox" id="check2"  onclick="box2()">

<p id="fill">No boxes are checked</p>

<p id="text" style="display:none">Checkbox1 is CHECKED!</p>
<p id="text2" style="display:none">Checkbox2 is CHECKED!</p>


<script>
function box1() {
  var checkBox = document.getElementById("check1");
  var text = document.getElementById("text");
  var fill = document.getElementById("fill");
  if (checkBox.checked == true){
      text.style.display = "block";
      fill.style.display = "none";
  } else {
      text.style.display = "none";
      fill.style.display = "block";
  }
}
</script>
<script>
function box2() {
  var checkBox = document.getElementById("check2");
  var text = document.getElementById("text2");
  var fill = document.getElementById("fill");
  if (checkBox.checked == true){
    text.style.display = "block";
    fill.style.display = "none";
  } else {
     text.style.display = "none";
     fill.style.display = "block";
  }
 }
</script>

</body>
</html>

Моя проблема в том, что текст показывает, что даже флажок установлен, как показано на рисунке. Как я могу сделать это эффективно? спасибо!

enter image description here

Ответы [ 3 ]

2 голосов
/ 20 февраля 2020

Я бы добавил одного и того же слушателя в оба флажка, и чтобы этот слушатель проверял состояние обоих. Затем, если оба не проверены, отобразите fill:

const isCheckeds = document.querySelectorAll('.is-checked');
const fill = document.querySelector('#fill');
function validate() {
  let anyChecked = false;
  document.querySelectorAll('input').forEach((checkbox, i) => {
    if (checkbox.checked) {
      anyChecked = true;
    }
    isCheckeds[i].style.display = checkbox.checked ? 'block' : 'none';
  });
  fill.style.display = anyChecked ? 'none' : 'block';
}
<p>Display some text when the checkbox is checked:</p>

Checkbox 1: <input type="checkbox" onclick="validate()"><br>
Checkbox 2: <input type="checkbox" onclick="validate()">

<p id="fill">No boxes are checked</p>

<p class="is-checked" style="display:none">Checkbox1 is CHECKED!</p>
<p class="is-checked" style="display:none">Checkbox2 is CHECKED!</p>

Обратите внимание, что встроенных обработчиков следует избегать . Настоятельно рекомендуем установить их правильно с помощью Javascript. Вы также можете рассмотреть возможность использования change слушателя вместо click слушателя (для лучшей доступности), и вы можете заключить входы в <label>, чтобы сделать их более интерактивными:

const isCheckeds = document.querySelectorAll('.is-checked');
const fill = document.querySelector('#fill');
const checkboxes = document.querySelectorAll('input');
function validate() {
  let anyChecked = false;
  checkboxes.forEach((checkbox, i) => {
    if (checkbox.checked) {
      anyChecked = true;
    }
    isCheckeds[i].style.display = checkbox.checked ? 'block' : 'none';
  });
  fill.style.display = anyChecked ? 'none' : 'block';
}
for (const checkbox of checkboxes) {
  checkbox.addEventListener('change', validate);
}
<p>Display some text when the checkbox is checked:</p>

<label>Checkbox 1: <input type="checkbox"></label><br>
<label>Checkbox 2: <input type="checkbox"></label>

<p id="fill">No boxes are checked</p>

<p class="is-checked" style="display:none">Checkbox1 is CHECKED!</p>
<p class="is-checked" style="display:none">Checkbox2 is CHECKED!</p>
1 голос
/ 20 февраля 2020

Javascript не требуется для этой задачи: с вашей структурой разметки вы можете использовать только CSS

:checked ~ p, #cb1, #cb2 {
  display: none;
}


#check1:checked ~ #cb1,
#check2:checked ~ #cb2 { display: block; }
<p>Display some text when the checkbox is checked:</p>

Checkbox 1: <input type="checkbox" id="check1"><br>
Checkbox 2: <input type="checkbox" id="check2">

<p id="cb0">No boxes are checked</p>
<p id="cb1">Checkbox1 is checked</p>
<p id="cb2">Checkbox2 is checked!</p>
1 голос
/ 20 февраля 2020

Вы забыли определить заливку через document.getElementById во втором флажке. Прямо сейчас вы отключаете заливку на первом флажке при взаимодействии со вторым. Я думаю, что это вызывает некоторые проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...