Es gibt mehrere nützliche Antworten, aber keine scheint die neuesten Optionen abzudecken . Zu diesem Zweck berücksichtigen alle meine Beispiele auch das Vorhandensein übereinstimmender label
Elemente und ermöglichen es Ihnen, dynamisch Kontrollkästchen hinzuzufügen und die Ergebnisse in einem Seitenbereich anzuzeigen (durch Umleiten console.log
).
Das Abhören von click
Ereignissen checkboxes
ist keine gute Idee, da dadurch weder die Tastatur umgeschaltet noch Änderungen vorgenommen werden können, bei denen auf ein übereinstimmendes label
Element geklickt wurde. Hören Sie immer auf das change
Ereignis.
Verwenden Sie den :checkbox
Pseudo-Selektor jQuery anstelle von input[type=checkbox]
. :checkbox
ist kürzer und besser lesbar.
Verwenden Sie diese is()
Option mit dem :checked
Pseudo-Selektor jQuery , um zu testen, ob ein Kontrollkästchen aktiviert ist. Dies funktioniert garantiert in allen Browsern.
Grundlegende Ereignisbehandlungsroutine, die an vorhandene Elemente angehängt ist:
$('#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/
Anmerkungen:
- Verwendet den
:checkbox
Selektor, der der Verwendung vorzuziehen istinput[type=checkbox]
- Dies stellt nur eine Verbindung zu übereinstimmenden Elementen her, die zum Zeitpunkt der Registrierung des Ereignisses vorhanden waren.
Delegierter Ereignishandler, der an das Vorgängerelement angehängt ist:
Delegierte Ereignishandler sind für Situationen konzipiert, in denen die Elemente möglicherweise noch nicht vorhanden sind (dynamisch geladen oder erstellt), und sind sehr nützlich. Sie delegieren die Verantwortung an ein Ahnenelement (daher der Begriff).
$('#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/
Anmerkungen:
- Dies funktioniert, indem auf Ereignisse gewartet wird (in diesem Fall
change
), um zu einem sich nicht ändernden Vorfahrenelement (in diesem Fall #myform
) aufzublasen .
- Es dann wendet die jQuery Selektor (
':checkbox'
in diesem Fall) , um nur die Elemente in der Blasenkette .
- Es dann gilt die Event - Handler - Funktion auf nur die passenden Elemente, die das Ereignis ausgelöst hat .
- Verwenden Sie diese Option
document
als Standard, um den delegierten Ereignishandler zu verbinden, wenn nichts anderes näher / bequemer ist.
- Nicht
body
zum Anhängen delegierter Ereignisse verwenden, da es einen Fehler (im Zusammenhang mit dem Styling) gibt, der verhindern kann, dass Mausereignisse abgerufen werden.
Das Ergebnis delegierter Handler ist, dass die übereinstimmenden Elemente nur zur Ereigniszeit vorhanden sein müssen und nicht, wenn der Ereignishandler registriert wurde. Dies ermöglicht dynamisch hinzugefügten Inhalt, um die Ereignisse zu generieren.
F: Ist es langsamer?
A: Solange sich die Ereignisse mit Benutzerinteraktionsgeschwindigkeiten befinden, müssen Sie sich keine Gedanken über den vernachlässigbaren Geschwindigkeitsunterschied zwischen einem delegierten Ereignishandler und einem direkt verbundenen Handler machen. Die Vorteile der Delegation überwiegen bei weitem alle geringfügigen Nachteile. Delegierte Ereignishandler lassen sich tatsächlich schneller registrieren, da sie normalerweise eine Verbindung zu einem einzelnen übereinstimmenden Element herstellen.
Warum wird prop('checked', true)
das change
Ereignis nicht ausgelöst?
Dies ist eigentlich beabsichtigt. Wenn es das Ereignis auslösen würde, würden Sie leicht in eine Situation endloser Updates geraten. Senden Sie stattdessen nach dem Ändern der aktivierten Eigenschaft ein Änderungsereignis mit trigger
(nicht triggerHandler
) an dasselbe Element :
zB ohne dass ein trigger
Ereignis eintritt
$cb.prop('checked', !$cb.prop('checked'));
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/5/
zB mit trigger
dem normalen Änderungsereignis wird abgefangen
$cb.prop('checked', !$cb.prop('checked')).trigger('change');
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/6/
Anmerkungen:
- Verwenden Sie es nicht
triggerHandler
wie von einem Benutzer vorgeschlagen, da es keine Ereignisse an einen delegierten Ereignishandler weiterleitet.
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/8/
obwohl es wird für einen Event - Handler arbeiten direkt mit dem Element:
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/9/
Mit .triggerHandler () ausgelöste Ereignisse sprudeln nicht in die DOM-Hierarchie. Wenn sie nicht direkt vom Zielelement verarbeitet werden, tun sie nichts.
Referenz: http://api.jquery.com/triggerhandler/
Wenn jemand zusätzliche Funktionen hat, von denen er glaubt, dass sie nicht davon betroffen sind, schlagen Sie bitte Ergänzungen vor .
this
ist bereits auf das DOM-Element des Kontrollkästchens eingestellt und reicht daherthis.checked
aus. Sie müssen kein weiteres jQuery-Objekt dafür erstellen, es sei denn, Sie möchten es bearbeiten.