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 labelElemente 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 clickEreignissen checkboxesist keine gute Idee, da dadurch weder die Tastatur umgeschaltet noch Änderungen vorgenommen werden können, bei denen auf ein übereinstimmendes labelElement geklickt wurde. Hören Sie immer auf das changeEreignis.
Verwenden Sie den :checkboxPseudo-Selektor jQuery anstelle von input[type=checkbox]. :checkboxist kürzer und besser lesbar.
Verwenden Sie diese is()Option mit dem :checkedPseudo-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
:checkboxSelektor, 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
documentals Standard, um den delegierten Ereignishandler zu verbinden, wenn nichts anderes näher / bequemer ist.
- Nicht
bodyzum 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 changeEreignis 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 triggerEreignis eintritt
$cb.prop('checked', !$cb.prop('checked'));
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/5/
zB mit triggerdem normalen Änderungsereignis wird abgefangen
$cb.prop('checked', !$cb.prop('checked')).trigger('change');
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/6/
Anmerkungen:
- Verwenden Sie es nicht
triggerHandlerwie 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 .
thisist bereits auf das DOM-Element des Kontrollkästchens eingestellt und reicht daherthis.checkedaus. Sie müssen kein weiteres jQuery-Objekt dafür erstellen, es sei denn, Sie möchten es bearbeiten.