Esistono diverse risposte utili, ma nessuna sembra coprire tutte le ultime opzioni. A tal fine, tutti i miei esempi soddisfano anche la presenza di label
elementi corrispondenti e consentono anche di aggiungere dinamicamente caselle di controllo e vedere i risultati in un pannello laterale (reindirizzando console.log
).
L'ascolto di click
eventi noncheckboxes
è una buona idea in quanto ciò non consentirà la commutazione della tastiera o le modifiche apportate quando è stato fatto clic su un elemento corrispondente . Ascolta sempre l' evento.label
change
Utilizzare lo :checkbox
pseudo-selettore jQuery anziché input[type=checkbox]
. :checkbox
è più breve e più leggibile.
Utilizzare is()
con lo :checked
pseudo-selettore jQuery per verificare se una casella di controllo è selezionata. Questo è garantito per funzionare su tutti i browser.
Gestore di eventi di base associato ad elementi esistenti:
$('#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/
Appunti:
- Utilizza il
:checkbox
selettore, che è preferibile utilizzareinput[type=checkbox]
- Questo si collega solo agli elementi corrispondenti esistenti al momento della registrazione dell'evento.
Gestore di eventi delegato associato all'elemento antenato:
I gestori di eventi delegati sono progettati per situazioni in cui gli elementi potrebbero non esistere ancora (caricati o creati dinamicamente) ed è molto utile. Essi delegano la responsabilità di un elemento antenato (da qui il termine).
$('#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/
Appunti:
- Funziona ascoltando gli eventi (in questo caso
change
) per passare a un elemento antenato che non cambia (in questo caso #myform
).
- E poi applica il selettore jQuery (
':checkbox'
in questo caso) per solo gli elementi della catena bolla .
- E poi si applica la funzione di gestore di eventi per solo gli elementi corrispondenti che hanno causato l'evento.
- Utilizzare
document
come predefinito per connettere il gestore eventi delegato, se nient'altro è più vicino / conveniente.
- Non utilizzare
body
per collegare eventi delegati in quanto ha un bug (da fare con lo stile) che può impedirgli di ottenere eventi del mouse.
Il risultato dei gestori delegati è che gli elementi corrispondenti devono esistere solo al momento dell'evento e non quando il gestore eventi è stato registrato. Ciò consente di aggiungere dinamicamente contenuti per generare gli eventi.
Q: è più lento?
A: Finché gli eventi sono a velocità di interazione dell'utente, non è necessario preoccuparsi della differenza trascurabile nella velocità tra un gestore eventi delegato e un gestore collegato direttamente. I vantaggi della delega superano di gran lunga qualsiasi aspetto negativo minore. I gestori di eventi delegati sono in realtà più veloci da registrare in quanto si collegano in genere a un singolo elemento corrispondente.
Perché non prop('checked', true)
attiva l' change
evento?
Questo è in realtà di progettazione. Se ha generato l'evento, potresti facilmente entrare in una situazione di aggiornamenti infiniti. Invece, dopo aver modificato la proprietà selezionata, invia un evento change allo stesso elemento usando trigger
(not triggerHandler
):
ad es. senza trigger
eventi
$cb.prop('checked', !$cb.prop('checked'));
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/5/
ad es. con trigger
il normale evento di cambiamento viene catturato
$cb.prop('checked', !$cb.prop('checked')).trigger('change');
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/6/
Appunti:
- Non utilizzare
triggerHandler
come suggerito da un utente, in quanto non distribuirà gli eventi a un gestore eventi delegato .
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/8/
anche se sarà lavorare per un gestore di eventi collegato direttamente all'elemento:
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/9/
Gli eventi attivati con .triggerHandler () non eseguono la bolla nella gerarchia DOM; se non sono gestiti direttamente dall'elemento target, non fanno nulla.
Riferimento: http://api.jquery.com/triggerhandler/
Se qualcuno ha funzionalità aggiuntive che ritengono non siano coperte da questo, si prega di suggerire aggiunte .
this
è già impostato sull'elemento DOM della casella di controllo, quindithis.checked
è sufficiente. Non sarà necessario creare un altro oggetto jQuery per esso a meno che non si preveda di manipolarlo.