jQuery Checkbox Ereignisbehandlung

136

Ich habe folgendes:

<form id="myform">
   <input type="checkbox" name="check1" value="check1">
   <input type="checkbox" name="check2" value="check2">
</form>

Wie verwende ich jQuery, um einmyform eingetretenes Check-Ereignis zu erfassen und festzustellen, welches Kontrollkästchen aktiviert oder deaktiviert wurde (und ob es aktiviert oder deaktiviert wurde)?

aeq
quelle

Antworten:

243
$('#myform :checkbox').change(function() {
    // this will contain a reference to the checkbox   
    if (this.checked) {
        // the checkbox is now checked 
    } else {
        // the checkbox is now no longer checked
    }
});
Darin Dimitrov
quelle
30
thisist bereits auf das DOM-Element des Kontrollkästchens eingestellt und reicht daher this.checkedaus. Sie müssen kein weiteres jQuery-Objekt dafür erstellen, es sei denn, Sie möchten es bearbeiten.
Walf
18
Nur ein kleiner Tipp. Sie erhalten eine Leistungssteigerung, indem Sie das Kontrollkästchen input: in Ihrem Selektor anstelle des Kontrollkästchens nur: verwenden, da letzteres in das Kontrollkästchen Universal Selector *: übersetzt wird.
Jimmyystormig
23
Click befindet sich nicht in der Nähe eines Überprüfungsereignisses.
Peter
27
Dies ist keineswegs die beste Antwort. Wenn Sie eine entsprechende Bezeichnung für Ihre Eingabe (wie <label for='myInput'>Checkbox:</label><input id='myInput' name='myInput' type='checkbox'/>) haben und auf die Bezeichnung klicken, wird das Kontrollkästchen aktiviert, diese Funktion wird jedoch NICHT aufgerufen. Sie sollten die .change()Veranstaltung nutzen
Patrick
7
Diese Antwort liefert die Antwort nicht vollständig - siehe Anurags Antwort unten, die eine VIEL vollständigere (und genauere) Antwort ist. Diese Antwort ist natürlich teilweise richtig, aber wie gesagt, es ist nicht die beste Antwort.
Carnix
131

Verwenden Sie das Änderungsereignis.

$('#myform :checkbox').change(function() {
    // this represents the checkbox that was checked
    // do something with it
});
Anurag
quelle
5
Wenn das Kontrollkästchen ausgeblendet ist, kann ein Benutzer nicht mit ihm interagieren. Lassen Sie mich wissen, wenn Sie etwas anderes gemeint haben.
Anurag
1
Dies wird nicht ausgelöst $("input[name=check1]").prop('checked', true). Siehe jsfiddle.net/Z3E8V/2
Peter
15
Das ist beabsichtigt. Das programmgesteuerte Ändern der Eigenschaft eines DOM-Elements löst keine zugeordneten Ereignishandler aus. Sie müssen sie manuell auslösen.
Anurag
6
Dies sollte die ausgewählte Antwort sein. Sie umfasst das Klicken auf das Etikett eines Kontrollkästchens
Patrick
3
Aus der jQuery-Dokumentation: "Da :checkboxes sich um eine jQuery-Erweiterung handelt und nicht Teil der CSS-Spezifikation ist, können Abfragen mit :checkboxnicht die Leistungssteigerung der nativen DOM- querySelectorAll()Methode nutzen. Verwenden Sie [type="checkbox"]stattdessen eine bessere Leistung in modernen Browsern ."
NXT
54

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 .

Codierung weg
quelle
31

Verwenden der neuen Ein-Methode in jQuery (1.7): http://api.jquery.com/on/

    $('#myform').on('change', 'input[type=checkbox]', function(e) {
        console.log(this.name+' '+this.value+' '+this.checked);

    });
  • Der Event-Handler wird weiterleben
  • erfasst, ob das Kontrollkästchen über die Tastatur geändert wurde, und klickt nicht nur
Allen Hamilton
quelle
1
Dies wird nicht ausgelöst $("input[name=check1]").prop('checked', true). Siehe jsfiddle.net/Z3E8V/2
Peter
7
Fügen Sie einfach .triggerHandler('change');nach dem .propAnruf hinzu. Dann schaltet es die Box um UND ruft das Ereignis auf.
Hanna
5
$('#myform input:checkbox').click(
 function(e){
   alert($(this).is(':checked'))
 }
)
Denker
quelle
val()sagt Ihnen nicht , wenn checkedist true.
Walf
5

In Anerkennung der Tatsache , dass der Fragesteller jQuery ausdrücklich darum gebeten , und dass die gewählte Antwort richtig ist, sei darauf hingewiesen, dass dieses Problem nicht wirklich brauchen jQuery pro sagen. Wenn man dieses Problem ohne es lösen möchte, kann man einfach das einstellenonClick Attribut der Kontrollkästchen , denen Sie zusätzliche Funktionen hinzufügen möchten, z. B.:

HTML:

<form id="myform">
  <input type="checkbox" name="check1" value="check1" onClick="cbChanged(this);">
  <input type="checkbox" name="check2" value="check2" onClick="cbChanged(this);">
</form>

Javascript:

function cbChanged(checkboxElem) {
  if (checkboxElem.checked) {
    // Do something special
  } else {
    // Do something else
  }
}

Geige: http://jsfiddle.net/Y9f66/1/

Chase Sandmann
quelle
5
Das direkte Einfügen von Ereignishandlern in HTML funktioniert natürlich. Es steht jedoch in direktem Konflikt mit DRY und progressiven Verbesserungsmethoden. Eine genauere Antwort wäre "Sie brauchen jQuery nicht, um Ereignishandler hinzuzufügen" und stattdessen Standard-JS zu verwenden, um die Klick-Handler in einer separaten JS-Datei anzuhängen, anstatt onclick-Attribute in den HTML-Code einzufügen. Dies "funktioniert", aber eine gute Codierungspraxis schreibt vor, dass Sie es nach Möglichkeit vermeiden sollten (was fast immer an diesem Punkt der
Fall
3

Ich habe versucht, den Code von der ersten Antwort, es funktioniert nicht, aber ich habe herumgespielt und diese Arbeit für mich

$('#vip').change(function(){
    if ($(this).is(':checked')) {
        alert('checked');
    } else {
        alert('uncheck');
    }
});
Somwang Souksavatd
quelle