Как реализовать флажок «выбрать все» в HTML?


218

У меня есть HTML-страница с несколькими флажками.

Мне нужен еще один флажок с именем «выбрать все». Когда я выбираю этот флажок, все флажки на странице HTML должны быть установлены. Как я могу это сделать?


1
Если вы хотите изящно ухудшить качество, выбор «выбрать все» должен фактически означать, что все выбраны независимо от их индивидуального состояния. (посещение вашей страницы с отключенным JavaScript)
около

В Firefox (а может и других?): Нажмите, CTRL+SHIFT+Kчтобы открыть консоль, затем вставьте : $("input:checkbox").attr('checked', true)и нажмите Enter. Все флажки на текущей странице должны быть отмечены. Чтобы отменить изменение Trueв False.
ashleedawg

Ответы:


308
<script language="JavaScript">
function toggle(source) {
  checkboxes = document.getElementsByName('foo');
  for(var checkbox in checkboxes)
    checkbox.checked = source.checked;
}
</script>

<input type="checkbox" onClick="toggle(this)" /> Toggle All<br/>

<input type="checkbox" name="foo" value="bar1"> Bar 1<br/>
<input type="checkbox" name="foo" value="bar2"> Bar 2<br/>
<input type="checkbox" name="foo" value="bar3"> Bar 3<br/>
<input type="checkbox" name="foo" value="bar4"> Bar 4<br/>

ОБНОВИТЬ:

for each...inКонструкция не кажется на работу, по крайней мере , в этом случае, в Safari 5 или Chrome 5. Этот код должен работать во всех браузерах:

function toggle(source) {
  checkboxes = document.getElementsByName('foo');
  for(var i=0, n=checkboxes.length;i<n;i++) {
    checkboxes[i].checked = source.checked;
  }
}

1
для каждого (флажок var в флажках) --------------------------------------- должен: для (var checkbox в checkboxes)
HelloWorld

@HelloWorld: для каждого ... in действительно допустимо Javascript: developer.mozilla.org/en/Core_JavaScript_1.5_Reference/… Но, как указала porneL, это неясная конструкция. Кроме того, этот код не работает в Safari 5 или Chrome 5. Он работает в FF 3.6 и IIRC, он работал в Safari 4. for(var i in checkboxes) checkboxes[i].checked = source.checkedРаботает во всех браузерах.
Может Берк Гудер

3
Никогда не используйте for inс коллекцией или массивом
mplungjan

1
Почему вы делаете, , n=checkboxes.length;i<nа не просто i < checkboxes.length? В любом случае, чтобы сделать функцию универсальной (повторное использование кода), передайте дополнительный параметр: (source, checkboxes_name)and do document.getElementsByName(checkboxes_name);Это лучше, чем жестко кодировать имя и делать функцию специфичной для определенного набора флажков.
ADTC

3
Хорошо, так как мое редактирование было отклонено по какой-то причине, я думаю, я прокомментирую здесь. Конструкция для каждого устарела и не будет работать! Вы должны использовать его замену for(let checkbox of checkboxes).
Форрестхопкинса

126

Используя jQuery :

// Listen for click on toggle checkbox
$('#select-all').click(function(event) {   
    if(this.checked) {
        // Iterate each checkbox
        $(':checkbox').each(function() {
            this.checked = true;                        
        });
    } else {
        $(':checkbox').each(function() {
            this.checked = false;                       
        });
    }
});

HTML:

<input type="checkbox" name="checkbox-1" id="checkbox-1" />
<input type="checkbox" name="checkbox-2" id="checkbox-2" />
<input type="checkbox" name="checkbox-3" id="checkbox-3" />

<!-- select all boxes -->
<input type="checkbox" name="select-all" id="select-all" />

24
я бы добавил предложение else для обработки сценария отмены выбора, ;-) .. else {// Итерация каждого флажка $ (": checkbox"). each (function () {this.checked = false;}); }
изумруджава

4
Если вы хотите опустить операторы if и else и по-прежнему обрабатывать отмену выбора, вы можете сделать это следующим образом: var state = this.checked; $ (': checkbox'). each (function () {this.checked = state;});
Ассил

85

Я не уверен, что никто не ответил таким образом (используя jQuery ):

  $( '#container .toggle-button' ).click( function () {
    $( '#container input[type="checkbox"]' ).prop('checked', this.checked)
  })

Он чистый, не имеет циклов или выражений if / else и работает как шарм.


4
Всего три строки, просто => легко понять и работает для отмены выбора. Спасибо.
TeeJay

61

Чтобы отменить выбор:

$('#select_all').click(function(event) {
  if(this.checked) {
      // Iterate each checkbox
      $(':checkbox').each(function() {
          this.checked = true;
      });
  }
  else {
    $(':checkbox').each(function() {
          this.checked = false;
      });
  }
});

2
если и еще не нужно ... просто используйте this.checkedвместо этого
m13r

46

Я удивлен, что никто не упомянул document.querySelectorAll(). Чистое решение JavaScript, работает в IE9 +.

function toggle(source) {
    var checkboxes = document.querySelectorAll('input[type="checkbox"]');
    for (var i = 0; i < checkboxes.length; i++) {
        if (checkboxes[i] != source)
            checkboxes[i].checked = source.checked;
    }
}
<input type="checkbox" onclick="toggle(this);" />Check all?<br />

<input type="checkbox" />Bar 1<br />
<input type="checkbox" />Bar 2<br />
<input type="checkbox" />Bar 3<br />
<input type="checkbox" />Bar 4<br />


1
это работало в Chrome, но у меня было много флажков по разным причинам, поэтому вместо таргетинга 'type = "checkbox"' я выбрал "name =" myobject "', и это также сработало.
Rich701

Может быть, это следует изменить на новый правильный ответ, если не было бы полезно какое-то обсуждение. :-)
Джесси Стил

Этот ответ было намного легче внедрить в существующие страницы, чем другие ответы. хорошая работа.
TS

16

Демо http://jsfiddle.net/H37cb/

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js" /></script>

<script type="text/javascript">
$(document).ready(function(){

$('input[name="all"],input[name="title"]').bind('click', function(){
var status = $(this).is(':checked');
$('input[type="checkbox"]', $(this).parent('li')).attr('checked', status);
});

});
</script>




<div id="wrapper">
 <li style="margin-top: 20px">
  <input type="checkbox" name="all" id="all" /> <label for='all'>All</label>
  <ul>
   <li><input type="checkbox" name="title" id="title_1" /> <label for="title_1"><strong>Title 01</strong></label>
    <ul>
     <li><input type="checkbox" name="selected[]" id="box_1" value="1" /> <label for="box_1">Sub Title 01</label></li>
     <li><input type="checkbox" name="selected[]" id="box_2" value="2" /> <label for="box_2">Sub Title 02</label></li>
     <li><input type="checkbox" name="selected[]" id="box_3" value="3" /> <label for="box_3">Sub Title 03</label></li>
     <li><input type="checkbox" name="selected[]" id="box_4" value="4" /> <label for="box_4">Sub Title 04</label></li>
    </ul>
   </li>
  </ul>
  <ul>
   <li><input type="checkbox" name="title" id="title_2" /> <label for="title_2"><strong>Title 02</strong></label>
    <ul>
     <li><input type="checkbox" name="selected[]" id="box_5" value="5" /> <label for="box_5">Sub Title 05</label></li>
     <li><input type="checkbox" name="selected[]" id="box_6" value="6" /> <label for="box_6">Sub Title 06</label></li>
     <li><input type="checkbox" name="selected[]" id="box_7" value="7" /> <label for="box_7">Sub Title 07</label></li>
    </ul>
   </li>
  </ul>
 </li>
</div>

1
Для меня это работает только для одного цикла. Он переключается только один раз, тогда он ничего не делает.
Mrudult

Так что это attr()метод, я думаю. изменил это наprop()
Mrudult

Что ж, если я отменил выбор какого-либо элемента из списка, не должен быть снят флажок «Выбрать все»?
some_other_guy

10

Слегка измененная версия, которая уважительно проверяет и снимает галочки

$('#select-all').click(function(event) {
        var $that = $(this);
        $(':checkbox').each(function() {
            this.checked = $that.is(':checked');
        });
    });

10

Когда вы позвоните document.getElementsByName("name"), вы получите Object. Используйте, .item(index)чтобы пройти все предметыObject

HTML:

<input type="checkbox" onclick="for(c in document.getElementsByName('rfile')) document.getElementsByName('rfile').item(c).checked = this.checked">

<input type=​"checkbox" name=​"rfile" value=​"/​cgi-bin/​"><input type=​"checkbox" name=​"rfile" value=​"/​includes/​"><input type=​"checkbox" name=​"rfile" value=​"/​misc/​"><input type=​"checkbox" name=​"rfile" value=​"/​modules/​"><input type=​"checkbox" name=​"rfile" value=​"/​profiles/​"><input type=​"checkbox" name=​"rfile" value=​"/​scripts/​"><input type=​"checkbox" name=​"rfile" value=​"/​sites/​"><input type=​"checkbox" name=​"rfile" value=​"/​stats/​"><input type=​"checkbox" name=​"rfile" value=​"/​themes/​">

9
<html>

<head>
<script type="text/javascript">

    function do_this(){

        var checkboxes = document.getElementsByName('approve[]');
        var button = document.getElementById('toggle');

        if(button.value == 'select'){
            for (var i in checkboxes){
                checkboxes[i].checked = 'FALSE';
            }
            button.value = 'deselect'
        }else{
            for (var i in checkboxes){
                checkboxes[i].checked = '';
            }
            button.value = 'select';
        }
    }
</script>
</head>

<body>
<input type="checkbox" name="approve[]" value="1" />
<input type="checkbox" name="approve[]" value="2" />
<input type="checkbox" name="approve[]" value="3" />

<input type="button" id="toggle" value="select" onClick="do_this()" />
</body>

</html>

9

Мое простое решение позволяет выборочно выбирать / отменять выбор всех флажков в заданной части формы , используя разные имена для каждого флажка, чтобы их можно было легко распознать после отправки формы.

Javascript:

function setAllCheckboxes(divId, sourceCheckbox) {
    divElement = document.getElementById(divId);
    inputElements = divElement.getElementsByTagName('input');
    for (i = 0; i < inputElements.length; i++) {
        if (inputElements[i].type != 'checkbox')
            continue;
        inputElements[i].checked = sourceCheckbox.checked;
    }
}

Пример HTML:

<p><input onClick="setAllCheckboxes('actors', this);" type="checkbox" />All of them</p>
<div id="actors">
    <p><input type="checkbox" name="kevin" />Spacey, Kevin</p>
    <p><input type="checkbox" name="colin" />Firth, Colin</p>
    <p><input type="checkbox" name="scarlett" />Johansson, Scarlett</p>
</div>

Я надеюсь тебе это понравится!


9

Попробуйте этот простой JQuery:

$('#select-all').click(function(event) {
  if (this.checked) {
    $(':checkbox').prop('checked', true);
  } else {
    $(':checkbox').prop('checked', false);
  }
});

1
Вы можете упростить это до $(':checkbox').prop('checked', this.checked), без необходимости условного.
Sumit

7

JavaScript - ваш лучший выбор. Ссылка ниже дает пример использования кнопок для отмены / выбора всего. Вы можете попытаться адаптировать его для использования флажка, просто используйте атрибут «выбрать все» флажок onClick.

Функция Javascript для проверки или снятия всех флажков

Эта страница имеет более простой пример

http://www.htmlcodetutorial.com/forms/_INPUT_onClick.html


7

Этот пример работает с нативным JavaScript, где имя переменной флажка меняется, то есть не все "foo".

<!DOCTYPE html>
<html>
<body>

<p>Toggling checkboxes</p>
<script>
function getcheckboxes() {
    var node_list = document.getElementsByTagName('input');
    var checkboxes = [];
    for (var i = 0; i < node_list.length; i++) 
    {
        var node = node_list[i];
        if (node.getAttribute('type') == 'checkbox') 
    {
            checkboxes.push(node);
        }
    } 
    return checkboxes;
}
function toggle(source) {
  checkboxes = getcheckboxes();
  for(var i=0, n=checkboxes.length;i<n;i++) 
  {
    checkboxes[i].checked = source.checked;
  }
}
</script>


<input type="checkbox" name="foo1" value="bar1"> Bar 1<br/>
<input type="checkbox" name="foo2" value="bar2"> Bar 2<br/>
<input type="checkbox" name="foo3" value="bar3"> Bar 3<br/>
<input type="checkbox" name="foo4" value="bar4"> Bar 4<br/>

<input type="checkbox" onClick="toggle(this)" /> Toggle All<br/>

</body>
</html>

2
ваша getcheckboxesфункция может быть заменена наdocument.querySelectorAll('input[type=checkbox]');
Kaiido

4
<asp:CheckBox ID="CheckBox1" runat="server" Text="Select All" onclick="checkAll(this);" />
<br />
<asp:CheckBoxList ID="CheckBoxList1" runat="server">
    <asp:ListItem Value="Item 1">Item 1</asp:ListItem>
    <asp:ListItem Value="Item 2">Item 2</asp:ListItem>
    <asp:ListItem Value="Item 3">Item 3</asp:ListItem>
    <asp:ListItem Value="Item 4">Item 4</asp:ListItem>
    <asp:ListItem Value="Item 5">Item 5</asp:ListItem>
    <asp:ListItem Value="Item 6">Item 6</asp:ListItem>
</asp:CheckBoxList>

<script type="text/javascript">
    function checkAll(obj1) {
        var checkboxCollection = document.getElementById('<%=CheckBoxList1.ClientID %>').getElementsByTagName('input');

        for (var i = 0; i < checkboxCollection.length; i++) {
            if (checkboxCollection[i].type.toString().toLowerCase() == "checkbox") {
                checkboxCollection[i].checked = obj1.checked;
            }
        }
    }
</script>


2
$(document).ready(function() {
                $(document).on(' change', 'input[name="check_all"]', function() {
                    $('.cb').prop("checked", this.checked);
                });
            });

2

Использование jQuery и нокаут:

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

ko.bindingHandlers.allChecked = {
  init: function (element, valueAccessor) {
    var selector = valueAccessor();

    function getChecked () {
      element.checked = $(selector).toArray().every(function (checkbox) {
        return checkbox.checked;
      });
    }

    function setChecked (value) {
      $(selector).toArray().forEach(function (checkbox) {
        if (checkbox.checked !== value) {
          checkbox.click();
        }
      });
    }

    ko.utils.registerEventHandler(element, 'click', function (event) {
      setChecked(event.target.checked);
    });

    $(window.document).on('change', selector, getChecked);

    ko.utils.domNodeDisposal.addDisposeCallback(element, () => {
      $(window.document).off('change', selector, getChecked);
    });

    getChecked();
  }
};

в формате HTML:

<input id="check-all-values" type="checkbox" data-bind="allChecked: '.checkValue'"/>
<input id="check-1" type="checkbox" class="checkValue"/>
<input id="check-2" type="checkbox" class="checkValue"/>

Я не знаю достаточно о нокауте (я использую ko3.4 с cdnjs.cloudflare.com, но вышеприведенное, похоже, не работает - вообще. Я могу установить точку останова при первоначальном вызове init: call, который срабатывает при загрузке страницы (что, я полагаю, правильно), но вход в это ничего не дает - ни одна из остальных функций не выполняется. Установка точек останова для других функций, и они никогда не срабатывают.
Тони Саффолк 66

Тони Саффолк, там установлены два обработчика событий: onclick и onchange для флажка, и значение флажка обновляется в конце кода. Если этот код не работает в вашем проекте, установите флажок для атрибута привязки данных.
Blazkovicz

2

Вы можете иметь разные наборы флажков в одной форме . Вот решение, которое выбирает / снимает флажки по имени класса, используя ванильную функцию javascript document.getElementsByClassName

Кнопка Выбрать все

<input type='checkbox' id='select_all_invoices' onclick="selectAll()"> Select All

Некоторые из флажков, чтобы выбрать

<input type='checkbox' class='check_invoice' id='check_123' name='check_123' value='321' />
<input type='checkbox' class='check_invoice' id='check_456' name='check_456' value='852' />

JavaScript

    function selectAll() {
        var blnChecked = document.getElementById("select_all_invoices").checked;
        var check_invoices = document.getElementsByClassName("check_invoice");
        var intLength = check_invoices.length;
        for(var i = 0; i < intLength; i++) {
            var check_invoice = check_invoices[i];
            check_invoice.checked = blnChecked;
        }
    }

1
Это работает. Пожалуйста, проверьте codepen.io/kustomweb/pen/gZqwLV
Николас Гишпенц

2

Это то, что это будет делать, например, если у вас есть 5 флажков, и вы нажимаете флажок «все», он проверяет все, теперь, если вы снимите все флажки, вероятно, нажав каждые 5 флажков, к тому времени, когда вы снимите последний флажок, выберите все флажки также не отмечены

$("#select-all").change(function(){
   $(".allcheckbox").prop("checked", $(this).prop("checked"))
  })
  $(".allcheckbox").change(function(){
      if($(this).prop("checked") == false){
          $("#select-all").prop("checked", false)
      }
      if($(".allcheckbox:checked").length == $(".allcheckbox").length){
          $("#select-all").prop("checked", true)
      }
  })

2

Поскольку я не могу комментировать, здесь как ответ: я бы написал решение Can Berk Güder в более общем виде, так что вы можете использовать эту функцию для других флажков

<script language="JavaScript">
  function toggleCheckboxes(source, cbName) {
    checkboxes = document.getElementsByName(cbName);
    for (var i = 0, n = checkboxes.length; i < n; i++) {
      checkboxes[i].checked = source.checked;
    }
  }
</script>
<input type="checkbox" onClick="toggleCheckboxes(this,\'foo\')" /> Toggle All<br/>

<input type="checkbox" name="foo" value="bar1"> Bar 1<br/>
<input type="checkbox" name="foo" value="bar2"> Bar 2<br/>
<input type="checkbox" name="foo" value="bar3"> Bar 3<br/>
<input type="checkbox" name="foo" value="bar4"> Bar 4<br/>
<input type="checkbox" name="foo" value="bar5"> Bar 5<br/>

Спасибо Халди и Кларити за указание на отсутствующую скобку!
user219901

2

Если вы принимаете верхний ответ для jquery, помните, что объект, переданный функции click, является EventHandler, а не исходным объектом флажка. Поэтому код должен быть изменен следующим образом.

Html

<input type="checkbox" name="selectThemAll"/> Toggle All<br/>

<input type="checkbox" name="foo" value="bar1"> Bar 1<br/>
<input type="checkbox" name="foo" value="bar2"> Bar 2<br/>
<input type="checkbox" name="foo" value="bar3"> Bar 3<br/>
<input type="checkbox" name="foo" value="bar4"> Bar 4<br/>

Javascript

$(function() {
    jQuery("[name=selectThemAll]").click(function(source) { 
        checkboxes = jQuery("[name=foo]");
        for(var i in checkboxes){
            checkboxes[i].checked = source.target.checked;
        }
    });
})

не только неправильный первый тип ввода, но даже после его исправления это не сработало для меня
Сообщения об ошибках

1

Вот реализация backbone.js:

events: {
    "click #toggleChecked" : "toggleChecked"
},
toggleChecked: function(event) {

    var checkboxes = document.getElementsByName('options');
    for(var i=0; i<checkboxes.length; i++) {
        checkboxes[i].checked = event.currentTarget.checked;
    }

},

1

HTML

<input class='all' type='checkbox'> All
<input class='item' type='checkbox' value='1'> 1
<input class='item' type='checkbox' value='2'> 2
<input class='item' type='checkbox' value='3'> 3

Javascript

$(':checkbox.all').change(function(){
  $(':checkbox.item').prop('checked', this.checked);
});

1

1: добавить обработчик события onchange

<th><INPUT type="checkbox" onchange="checkAll(this)" name="chk[]" /> </th>

2: изменить код для обработки отмеченных / непроверенных

 function checkAll(ele) {
     var checkboxes = document.getElementsByTagName('input');
     if (ele.checked) {
         for (var i = 0; i < checkboxes.length; i++) {
             if (checkboxes[i].type == 'checkbox') {
                 checkboxes[i].checked = true;
             }
         }
     } else {
         for (var i = 0; i < checkboxes.length; i++) {
             console.log(i)
             if (checkboxes[i].type == 'checkbox') {
                 checkboxes[i].checked = false;
             }
         }
     }
 }

Пожалуйста, не копируйте код вставки, вместо этого используйте ссылку stackoverflow.com/questions/19282219/…
java_dude

1

Приведенные ниже методы очень просты для понимания, и вы можете реализовать существующие формы за считанные минуты

С Jquery,

$(document).ready(function() {
  $('#check-all').click(function(){
    $("input:checkbox").attr('checked', true);
  });
  $('#uncheck-all').click(function(){
    $("input:checkbox").attr('checked', false);
  });
});

в HTML-форме поставить кнопки ниже

<a id="check-all" href="javascript:void(0);">check all</a>
<a id="uncheck-all" href="javascript:void(0);">uncheck all</a> 

С помощью только JavaScript,

<script type="text/javascript">
function checkAll(formname, checktoggle)
{
  var checkboxes = new Array(); 
  checkboxes = document[formname].getElementsByTagName('input');

  for (var i=0; i<checkboxes.length; i++)  {
    if (checkboxes[i].type == 'checkbox')   {
      checkboxes[i].checked = checktoggle;
    }
  }
}
</script>

в HTML-форме поставить кнопки ниже

<button onclick="javascript:checkAll('form3', true);" href="javascript:void();">check all</button>

<button onclick="javascript:checkAll('form3', false);" href="javascript:void();">uncheck all</button>

0

Вы можете использовать этот простой код

$('.checkall').click(function(){
    var checked = $(this).prop('checked');
    $('.checkme').prop('checked', checked);
});

0

сделать это в сокращенной версии с помощью jQuery

Флажок выбрать все

<input type="checkbox" id="chkSelectAll">

Флажок детей

<input type="checkbox" class="chkDel">
<input type="checkbox" class="chkDel">
<input type="checkbox" class="chkDel">

JQuery

$("#chkSelectAll").on('click', function(){
     this.checked ? $(".chkDel").prop("checked",true) : $(".chkDel").prop("checked",false);  
})

0

Может быть, немного поздно, но при работе с флажком check all, я полагаю, вам следует также обработать сценарий, когда у вас установлен флажок check all, а затем снять один из флажков ниже.

В этом случае он должен автоматически снять флажок check all.

Кроме того, при ручной проверке всех флажков, вы должны в конечном итоге установить флажок флажок все автоматически.

Вам нужны два обработчика событий, один для флажка «все» и один для щелчка по любому из отдельных полей ниже.

// HANDLES THE INDIVIDUAL CHECKBOX CLICKS
function client_onclick() {
    var selectAllChecked = $("#chk-clients-all").prop("checked");

    // IF CHECK ALL IS CHECKED, AND YOU'RE UNCHECKING AN INDIVIDUAL BOX, JUST UNCHECK THE CHECK ALL CHECKBOX.
    if (selectAllChecked && $(this).prop("checked") == false) {
        $("#chk-clients-all").prop("checked", false);
    } else { // OTHERWISE WE NEED TO LOOP THROUGH INDIVIDUAL CHECKBOXES AND SEE IF THEY ARE ALL CHECKED, THEN CHECK THE SELECT ALL CHECKBOX ACCORDINGLY.
        var allChecked = true;
        $(".client").each(function () {
            allChecked = $(this).prop("checked");
            if (!allChecked) {
                return false;
            }
        });
        $("#chk-clients-all").prop("checked", allChecked);
    }
}

// HANDLES THE TOP CHECK ALL CHECKBOX
function client_all_onclick() {
    $(".client").prop("checked", $(this).prop("checked"));
}

-2

Просто и на ТОЧКУ:

jQuery - после нажатия кнопки, элемента div или элемента label. Отметьте все флажки на странице. Имейте в виду, что вам придется настроить флажок, чтобы сделать его более конкретным.

jQuery("#My-Button").click(function() {

  jQuery(':checkbox').each(function() {
    if(this.checked == true) {
      this.checked = false;                        
    } else {
      this.checked = true;                        
    }      
  });

});
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.