¿Cómo implementar la casilla de verificación "seleccionar todo" en HTML?


218

Tengo una página HTML con varias casillas de verificación.

Necesito una casilla más con el nombre "seleccionar todo". Cuando selecciono esta casilla de verificación, todas las casillas de verificación en la página HTML deben estar seleccionadas. ¿Cómo puedo hacer esto?


1
Si desea degradar con gracia, seleccionar "seleccionar todo" debería significar que todos se seleccionan independientemente de su estado individual. (visitando su página con JavaScript deshabilitado)
algunos

En Firefox (¿y quizás otros?): Presiona CTRL+SHIFT+Kpara abrir la consola, luego pega : $("input:checkbox").attr('checked', true)y presiona Enter. Todas las casillas de verificación en la página actual ahora deberían estar marcadas. Para desmarcar el cambio Truea False.
ashleedawg

Respuestas:


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/>

ACTUALIZAR:

La for each...inconstrucción no parece funcionar, al menos en este caso, en Safari 5 o Chrome 5. Este código debería funcionar en todos los navegadores:

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

1
para cada (casilla de verificación var en casillas de verificación) --------------------------------------- debería: para (casilla de verificación var en casillas de verificación)
HelloWorld

@HelloWorld: para cada ... en realidad es Javascript válido: developer.mozilla.org/en/Core_JavaScript_1.5_Reference/… Pero, como ha señalado porneL, es una construcción oscura. Además, este código no funciona en Safari 5 o Chrome 5. Funciona en FF 3.6, y IIRC, funciona en Safari 4. for(var i in checkboxes) checkboxes[i].checked = source.checkedfunciona en todos los navegadores.
¿Puede Berk Güder el

3
Nunca lo use for incon una colección o matriz
mplungjan

1
¿Por qué haces en , n=checkboxes.length;i<nlugar de solo i < checkboxes.length? De todos modos, para hacer que la función sea genérica (reutilización de código), pase un parámetro adicional: (source, checkboxes_name)y haga document.getElementsByName(checkboxes_name);Es mejor que codificar el nombre y hacer que la función sea específica para un conjunto particular de casillas de verificación.
ADTC

3
Bien, como mi edición fue rechazada por alguna razón, creo que comentaré aquí. ¡La construcción para cada uno está en desuso y no funcionará! Usted tiene que utilizar su sustitución: for(let checkbox of checkboxes).
forresthopkinsa

126

Usando 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
agregaría una cláusula else para manejar el caso de uso de deselección, ;-) .. else {// Iterate each checkbox $ (": checkbox"). each (function () {this.checked = false;}); }
emeraldjava

44
Si desea omitir el if y else y aún manejar la anulación de selección, puede hacerlo de esta manera: var state = this.checked; $ (': casilla de verificación'). each (function () {this.checked = state;});
Assil

85

No estoy seguro de que nadie haya respondido de esta manera (usando jQuery ):

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

Está limpio, no tiene bucles o cláusulas if / else y funciona como un encanto.


44
Solo tres líneas, simple => fácil de entender y funciona para deseleccionar también. Gracias.
TeeJay

61

Para que deseleccione:

$('#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
si y no es necesario ... solo use this.checkeden su lugar
m13r

46

Me sorprende que nadie lo haya mencionado document.querySelectorAll(). Solución de JavaScript puro, funciona en 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
esto funcionó en Chrome, pero tenía muchas casillas de verificación por diferentes razones, por lo que en lugar de apuntar a 'type = "checkbox"', apunté a 'name = "myobject"' y también funcionó.
Rich701

Tal vez esto debería cambiarse a la nueva respuesta correcta, si no, alguna discusión sería útil. :-)
Jesse Steele

Esta respuesta fue mucho más fácil de implementar en las páginas existentes que las otras respuestas. buen trabajo.
TS

16

Demo 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
Para mí, solo funciona durante un solo ciclo, se alterna solo una vez y luego no hace nada.
mrudult

Entonces es el attr()método, supongo. cambiado aprop()
mrudult

Bueno, si anulo la selección de cualquier elemento de la lista, ¿no debería estar desmarcada también la casilla Seleccionar todo?
some_other_guy

10

Versión ligeramente modificada que marca y desmarca respetuosamente

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

10

Cuando llame document.getElementsByName("name"), recibirá un Object. Use .item(index)para atravesar todos los elementos de unObject

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

Mi solución simple permite seleccionar / deseleccionar selectivamente todas las casillas de verificación en una parte determinada del formulario , mientras uso diferentes nombres para cada casilla de verificación, de modo que puedan reconocerse fácilmente después de que el formulario sea PUBLICADO.

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;
    }
}

Ejemplo 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>

¡Espero que te guste!


9

Prueba este simple JQuery:

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

1
Puede simplificar eso a $(':checkbox').prop('checked', this.checked), sin necesidad del condicional.
Sumit


7

Este ejemplo funciona con JavaScript nativo donde el nombre de la variable de la casilla de verificación varía, es decir, no todos "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
su getcheckboxesfunción podría ser reemplazada pordocument.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>

3

eso debería hacer el trabajo:

    $(':checkbox').each(function() {
        this.checked = true;                        
    });

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

2

Usando jQuery y knockout:

Con esta casilla de verificación principal vinculante permanece sincronizada con las casillas de verificación subyacentes, estará desmarcada a menos que todas las casillas de verificación estén marcadas.

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();
  }
};

en 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"/>

No sé lo suficiente sobre el knockout (estoy usando ko3.4 de cdnjs.cloudflare.com pero lo anterior parece no funcionar, en absoluto. Puedo establecer un punto de interrupción en el init inicial: llamada que se activa cuando se carga la página (lo cual supongo que es correcto), pero entrar en esto no produce nada: no se ejecuta nada del resto de la función. Establecer el punto de interrupción en las otras funciones y nunca se activan.
Tony Suffolk 66

Tony Suffolk, existen dos controladores de eventos: onclick y onchange para la casilla de verificación, y el valor de la casilla de verificación se actualiza al final del código. Si este código no funciona en su proyecto, marque el atributo de enlace de datos para la casilla de verificación.
blazkovicz

2

Puede tener diferentes conjuntos de casillas de verificación en el mismo formulario . Aquí hay una solución que selecciona / deselecciona las casillas de verificación por nombre de clase, utilizando la función de JavaScript vainilla document.getElementsByClassName

El botón Seleccionar todo

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

Algunas de las casillas de verificación para seleccionar

<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' />

El 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
Funciona Por favor, consulte codepen.io/kustomweb/pen/gZqwLV
Nicolas Giszpenc

2

Esto es lo que hará, por ejemplo, si tiene 5 casillas de verificación, y hace clic en marcar todo, marca todo, ahora si desmarca todas las casillas probablemente haciendo clic en cada 5 casillas de verificación, para cuando desmarque la última casilla, seleccione todas las casillas de verificación también se desmarcan

$("#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

Como no puedo comentar, aquí como respuesta: escribiría la solución de Can Berk Güder de una manera más general, por lo que puede reutilizar la función para otras casillas de verificación

<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/>

¡Gracias Khaldi y Clarity por señalar el soporte que falta!
user219901

2

Si adopta la respuesta principal para jquery, recuerde que el objeto pasado a la función de clic es un EventHandler, no el objeto de casilla de verificación original. Por lo tanto, el código debe modificarse de la siguiente manera.

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;
        }
    });
})

no solo el primer tipo de entrada es incorrecto, sino que incluso después de corregirlo no funcionó para mí
Mensajes de error

1

Aquí hay una implementación de 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: Agregue el controlador de eventos onchange

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

2: Modificar el código para manejar marcado / desmarcado

 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;
             }
         }
     }
 }

No copie el código de pegado, consulte un enlace stackoverflow.com/questions/19282219/…
java_dude

1

Los siguientes métodos son muy fáciles de entender y puede implementar formularios existentes en minutos

Con jquery

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

en forma HTML poner debajo de los botones

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

Con solo usar 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>

en forma HTML poner debajo de los botones

<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

Puedes usar este código simple

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

0

para hacerlo en versión abreviada usando jQuery

La casilla de verificación seleccionar todo

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

La casilla de verificación niños

<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

Tal vez un poco tarde, pero cuando se trata de marcar todas las casillas de verificación, creo que también debe manejar el escenario para cuando tiene marcada la casilla de verificación marcar todas, y luego desmarcar una de las casillas de verificación a continuación.

En ese caso, debería desmarcar automáticamente la casilla de verificación marcar todo.

Además, al marcar manualmente todas las casillas de verificación, debe terminar marcando la casilla de verificación marcar todas automáticamente.

Necesita dos controladores de eventos, uno para la casilla de verificación todo y otro para hacer clic en cualquiera de los cuadros individuales a continuación.

// 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

Simple y al PUNTO:

jQuery: al hacer clic en un botón o div o un elemento de etiqueta. Marque todas las casillas de verificación en la página. Tenga en cuenta que tendrá que ajustar: casilla de verificación para hacerlo más específico.

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

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

});
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.