Implementación de Selección y Deselección Múltiple en Formularios Web

En aplicaciones web, gestionar múltiples casillas de verificación suele requerir funciones como seleccionar todas, deseleccionar todas o invertir la selección. A continuación, se muestran enfoques utilizando jQuery y JavaScript puro.

Ejemplo con jQuery

Consideremos un formulario con casillas de verificación para deportes favoritos.

<form id="formularioDeportes">
  <p>Selecciona tus deportes favoritos:</p>
  <label><input type="checkbox" name="opciones" value="futbol"> Fútbol</label>
  <label><input type="checkbox" name="opciones" value="baloncesto"> Baloncesto</label>
  <label><input type="checkbox" name="opciones" value="tenis"> Tenis</label>
  <label><input type="checkbox" name="opciones" value="natacion"> Natación</label>
  <div>
    <button type="button" id="btnMarcarTodo">Marcar Todo</button>
    <button type="button" id="btnDesmarcarTodo">Desmarcar Todo</button>
    <button type="button" id="btnInvertir">Invertir Selección</button>
    <button type="button" id="btnEnviar">Enviar</button>
  </div>
</form>

Para manejar las acciones, se puede usar jQuery de la siguiente manera:

$(document).ready(function() {
    // Marcar todas las casillas
    $('#btnMarcarTodo').on('click', function() {
        $('input[type="checkbox"][name="opciones"]').prop('checked', true);
    });

    // Desmarcar todas las casillas
    $('#btnDesmarcarTodo').on('click', function() {
        $('input[type="checkbox"][name="opciones"]').prop('checked', false);
    });

    // Invertir la selección actual
    $('#btnInvertir').on('click', function() {
        $('input[type="checkbox"][name="opciones"]').each(function() {
            this.checked = !this.checked;
        });
    });

    // Recopilar valores seleccionados
    $('#btnEnviar').on('click', function() {
        var seleccionados = [];
        $('input[type="checkbox"][name="opciones"]:checked').each(function() {
            seleccionados.push($(this).val());
        });
        alert('Opciones seleccionadas: ' + seleccionados.join(', '));
    });
});

Integración con una Tabla de Datos

En escenarios como paneles de administración, se usa una tabla con casillas de verificación para acciones masivas. El código siguiente implementa selección múltiple sin jQuery.

<table id="tablaContenido">
  <thead>
    <tr>
      <th><input type="checkbox" id="chkSeleccionGlobal"></th>
      <th>Nombre del Elemento</th>
      <th>Descripción</th>
      <th>Estado</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><input type="checkbox" class="chk-elemento" data-id="1"></td>
      <td>Elemento Alpha</td>
      <td>Primera entrada de ejemplo</td>
      <td>Activo</td>
    </tr>
    <tr>
      <td><input type="checkbox" class="chk-elemento" data-id="2"></td>
      <td>Elemento Beta</td>
      <td>Segunda entrada de ejemplo</td>
      <td>Inactivo</td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <td colspan="4">
        <button type="button" onclick="accionEliminar()">Eliminar Seleccionados</button>
      </td>
    </tr>
  </tfoot>
</table>

El manejo de eventos se puede realizar con funciones JavaScript puras:

// Función para marcar o desmarcar todas las casillas
function gestionarSeleccionGlobal() {
    var casillaGlobal = document.getElementById('chkSeleccionGlobal');
    var casillasIndividuales = document.querySelectorAll('.chk-elemento');
    
    casillaGlobal.addEventListener('change', function() {
        var estaSeleccionada = this.checked;
        casillasIndividuales.forEach(function(casilla) {
            casilla.checked = estaSeleccionada;
        });
    });
}

// Actualizar estado de la casilla global basado en las individuales
function actualizarEstadoGlobal() {
    var casillasIndividuales = document.querySelectorAll('.chk-elemento');
    var casillaGlobal = document.getElementById('chkSeleccionGlobal');
    var todasSeleccionadas = true;
    
    casillasIndividuales.forEach(function(casilla) {
        if (!casilla.checked) {
            todasSeleccionadas = false;
        }
    });
    casillaGlobal.checked = todasSeleccionadas;
}

// Invertir selección de todas las casillas
function invertirSeleccion() {
    var casillas = document.querySelectorAll('.chk-elemento');
    casillas.forEach(function(casilla) {
        casilla.checked = !casilla.checked;
    });
    actualizarEstadoGlobal();
}

// Obtener IDs de elementos seleccionados para procesamiento
function obtenerSeleccionados() {
    var seleccionados = [];
    document.querySelectorAll('.chk-elemento:checked').forEach(function(casilla) {
        seleccionados.push(casilla.getAttribute('data-id'));
    });
    return seleccionados;
}

// Ejemplo de acción al enviar
function accionEliminar() {
    var ids = obtenerSeleccionados();
    if (ids.length === 0) {
        alert('Por favor, selecciona al menos un elemento.');
        return;
    }
    console.log('IDs a eliminar:', ids);
    // Aquí se podría enviar una solicitud al servidor
}

// Inicializar los event listeners
document.addEventListener('DOMContentLoaded', function() {
    gestionarSeleccionGlobal();
    // Agregar listener a casillas individuales para sincronizar la global
    document.querySelectorAll('.chk-elemento').forEach(function(casilla) {
        casilla.addEventListener('change', actualizarEstadoGlobal);
    });
});

Validación antes del Envío

Para formularios que requieren validación, se puede comprobar si hay casillas seleccionadas antes de proceder.

function validarSeleccion() {
    var casillasSeleccionadas = document.querySelectorAll('.chk-elemento:checked');
    if (casillasSeleccionadas.length === 0) {
        alert('No se ha seleccionado ningún elemento. Por favor, marca al menos una casilla.');
        return false;
    }
    return true;
}

// Uso en un evento de envío
document.getElementById('formularioDeportes').addEventListener('submit', function(e) {
    if (!validarSeleccion()) {
        e.preventDefault();
    }
});

Etiquetas: jQuery JavaScript HTML5 DOM checkboxes

Publicado el 7-20 11:15