Быстрый способ проверки, если все флажки сняты? - PullRequest
1 голос
/ 29 мая 2009

Существует ли быстрый способ или функция, которая сообщала бы мне true / false, если все флажки сняты? Не пройдя через массив? (с JS и HTML)

Все мои флажки имеют одинаковое имя ...

<form action="/cgi-bin/Lib.exe" method=POST name="checks" ID="Form2">
    <input type=checkbox name="us" value="Joe" ID="Checkbox1">
    <input type=checkbox name="us" value="Dan" ID="Checkbox2">
    <input type=checkbox name="us" value="Sal" ID="Checkbox3">
</form>

Ответы [ 7 ]

6 голосов
/ 29 мая 2009

jQuery будет массой ненужного раздувания для такой тривиальной задачи. Попробуйте использовать его, если вы используете его для других целей, но все, что вам нужно, это что-то вроде этого:

function AreAnyCheckboxesChecked () {
  var checkboxes = document.forms.Form2.elements.us;
  for (var i = 0; i < checkboxes.length; i++) {
    if (checkboxes[i].checked) {
      return true;
    }
  }
  return false;
}
5 голосов
/ 29 мая 2009

Вы должны пройти через них. Даже такая библиотека, как jQuery, будет проходить через них, просто скрыть это от вас.

var form = document.getElementById('Form2');
var inputs = form.getElementsByTagName('input');
var is_checked = false;
for(var x = 0; x < inputs.length; x++) {
    if(inputs[x].type == 'checkbox' && inputs[x].name == 'us') {
        is_checked = inputs[x].checked;
        if(is_checked) break;
    }
}
// is_checked will be boolean 'true' if any are checked at this point.
4 голосов
/ 29 мая 2009

JavaScript:

var allischecked = (function(){
  var o = document.getElementById("Form2").getElementsByTagName("input");
  for(var i=0,l=o.length;i<l;i++){
    o[i].type === "checkbox" && o[i].name === "us" && o[i].checked || return false;
  }
  return true;
})();

С помощью jQuery:

var allischecked = ($("#Form2 input:checkbox:not(checked)").length === 0);
2 голосов
/ 29 мая 2009

В итоге, этот фрагмент будет возвращать true, если все НЕ проверено. Выручает, как только проверенный найден.

var a = document.getElementsByName("us");
for(var i=0; i<a.length; i++)
   if(a[i].checked)
      return false;
return true;

(не тестировал, но концептуально это действительно)

0 голосов
/ 29 августа 2018

Правильное решение с атрибутом jQuery checked:

$checkboxes = $('#Form2 input:checkbox');
$checkboxes.on('click', checkboxes);

function checkboxes() {
  var allChecked = $checkboxes.not(':checked').length == 0;
  console.log(allChecked);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<form action="/cgi-bin/Lib.exe" method=POST name="checks" ID="Form2">
    <input type=checkbox name="us1" value="Joe" ID="Checkbox1"><label>Joe</>
    <input type=checkbox name="us2" value="Dan" ID="Checkbox2"><label>Dan</>
    <input type=checkbox name="us3" value="Sal" ID="Checkbox3"><label>Sal</>
</form>
0 голосов
/ 29 мая 2009

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

var checked = 0;

$("input[type=checkbox]").live("click", function() {
    if($(this).attr("checked")) checked++;
    else checked--;
}

Тогда вы сможете проверить, как это.

if(checked === 0) {
    doSomething();
}
0 голосов
/ 29 мая 2009

Что вы подразумеваете под

Не проходя через массив

Вы могли бы просто сделать

 function check() {
    var anyChecked = false;
    var form = document.getElementById('Form2');
    var checkboxes = form.getElementsByTagName('input');
    for(var i=0; i < checkboxes.length; i++) {
            if (checkboxes[i].checked) {
                anyChecked  = true;
                break;
            }
    } 
    alert("Checkboxes checked? " + anyChecked);
}

Рабочая демоверсия

...