Hay varias respuestas útiles, pero ninguna parece cubrir todas las últimas opciones. Con ese fin, todos mis ejemplos también atienden la presencia de label
elementos coincidentes y también le permiten agregar dinámicamente casillas de verificación y ver los resultados en un panel lateral (redirigiendo console.log
).
Escuchar click
eventos nocheckboxes
es una buena idea, ya que eso no permitirá alternar el teclado ni los cambios realizados cuando se hizo clic en un elemento coincidente . Siempre escucha el evento.label
change
Utilice el :checkbox
pseudo-selector jQuery , en lugar de input[type=checkbox]
. :checkbox
Es más corto y más legible.
Úselo is()
con el :checked
pseudo-selector jQuery para comprobar si una casilla de verificación está marcada. Esto está garantizado para funcionar en todos los navegadores.
Controlador de eventos básico adjunto a elementos existentes:
$('#myform :checkbox').change(function () {
if ($(this).is(':checked')) {
console.log($(this).val() + ' is now checked');
} else {
console.log($(this).val() + ' is now unchecked');
}
});
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/2/
Notas:
- Utiliza el
:checkbox
selector, que es preferible a usarinput[type=checkbox]
- Esto se conecta solo a elementos coincidentes que existen en el momento en que se registró el evento.
Controlador de eventos delegado adjunto al elemento ancestro:
Los controladores de eventos delegados están diseñados para situaciones en las que los elementos aún no existen (cargados o creados dinámicamente) y es muy útil. Se delegan la responsabilidad de un elemento ancestro (de ahí el término).
$('#myform').on('change', ':checkbox', function () {
if ($(this).is(':checked')) {
console.log($(this).val() + ' is now checked');
} else {
console.log($(this).val() + ' is now unchecked');
}
});
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/4/
Notas:
- Esto funciona escuchando los eventos (en este caso
change
) que se propagan a un elemento ancestro que no cambia (en este caso #myform
).
- Es entonces se aplica el selector de jQuery (
':checkbox'
en este caso) a sólo los elementos de la cadena de burbuja .
- Es entonces se aplica la función de controlador de eventos a sólo aquellos elementos coincidentes que ocasionaron el evento.
- Use
document
como predeterminado para conectar el controlador de eventos delegado, si nada más está más cerca / conveniente.
- No lo use
body
para adjuntar eventos delegados, ya que tiene un error (relacionado con el estilo) que puede evitar que reciba eventos del mouse.
El resultado de los controladores delegados es que los elementos coincidentes solo deben existir en el momento del evento y no cuando el controlador de eventos se registró. Esto permite contenido agregado dinámicamente para generar los eventos.
P: ¿Es más lento?
R: Mientras los eventos estén a velocidades de interacción del usuario, no necesita preocuparse por la insignificante diferencia de velocidad entre un controlador de eventos delegado y un controlador conectado directamente. Los beneficios de la delegación superan con creces cualquier inconveniente menor. Los controladores de eventos delegados son en realidad más rápidos para registrarse, ya que generalmente se conectan a un único elemento coincidente.
¿Por qué no prop('checked', true)
dispara el change
evento?
Esto es en realidad por diseño. Si desencadenara el evento, fácilmente se encontraría en una situación de actualizaciones interminables. En cambio, después de cambiar la propiedad marcada, envíe un evento de cambio al mismo elemento usando trigger
(no triggerHandler
):
por ejemplo, sin trigger
que ocurra ningún evento
$cb.prop('checked', !$cb.prop('checked'));
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/5/
por ejemplo, con trigger
el evento de cambio normal se detecta
$cb.prop('checked', !$cb.prop('checked')).trigger('change');
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/6/
Notas:
- No lo use
triggerHandler
como lo sugirió un usuario, ya que no burbujeará eventos a un controlador de eventos delegado .
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/8/
aunque será trabajar para un controlador de eventos directamente conectada al elemento:
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/9/
Los eventos activados con .triggerHandler () no hacen burbujear la jerarquía DOM; si el elemento objetivo no los maneja directamente, no hacen nada.
Referencia: http://api.jquery.com/triggerhandler/
Si alguien tiene características adicionales que considera que no están cubiertas por esto, sugiera adiciones .
this
ya está configurado en el elemento DOM de la casilla de verificación, por lo quethis.checked
es suficiente. No necesitará crear otro objeto jQuery para él a menos que planee manipularlo.