jQuery, Kontrollkästchen und .is (": markiert")


88

Wenn ich eine Funktion an ein Kontrollkästchen binde, wie:

$("#myCheckbox").click( function() {
    alert($(this).is(":checked"));
});

Das Kontrollkästchen ändert sein markiertes Attribut, bevor das Ereignis ausgelöst wird. Dies ist das normale Verhalten und führt zu einem umgekehrten Ergebnis.

Wenn ich jedoch:

$("#myCheckbox").click();

Das Kontrollkästchen ändert das Attribut "Aktiviert", nachdem das Ereignis ausgelöst wurde.

Meine Frage ist, gibt es eine Möglichkeit, das Klickereignis von jQuery aus auszulösen, wie es ein normaler Klick tun würde (erstes Szenario)?

PS: Ich habe es schon versucht mit trigger('click');


5
Ich habe das gerade überprüft. Sie sind völlig richtig. Das scheint ein Fehler zu sein. Ich würde es als Fehler mit jQuery auslösen
cletus

1
Was ist mit dem "Change" -Ereignis?
ZippyV

@cletus In der Tat ist es ein Jquery 1.4.2-Fehler. 1.3.2 funktioniert einwandfrei.
Ben

Ich sehe das gleiche Verhalten in 1.4.2 und 1.3.2: jsfiddle.net/HCUNn
Nick Craver

@Nick Es macht immer noch das Gegenteil von dem, was ein normaler Mausklick tun würde. Ich weiß ehrlich gesagt nicht, warum 1.3.2 für mich funktioniert und 1.4.2 nicht, aber das muss noch geändert werden.
Ben

Antworten:


96
$('#myCheckbox').change(function () {
    if ($(this).prop("checked")) {
        // checked
        return;
    }
    // not checked
});

Hinweis: In älteren Versionen von jquery war die Verwendung in Ordnung attr. Jetzt wird empfohlen,prop den Status zu lesen.


1
Ich habe versucht, dass "$ (# myCheckbox) .click ()" das Kontrollkästchen deaktiviert, aber die Änderungsfunktion wird nie ausgelöst. Ich habe auch versucht, das Attribut 'checked' zu ändern, anstatt click () aufzurufen und sogar die Funktion 'change' auf 'live' zu setzen.
Ben

@Ben - Sie müssen es auf eine andere Weise auslösen, damit dies ausgeführt wird. Siehe meine Antwort für die Trigger-Anweisung.
Nick Craver

@ Nick Danke, ich werde die Antwort akzeptieren, da er der erste war, der die Lösung herausbrachte. Blöd, ich habe die 'change'-Methode nicht ausgelöst.
Ben

19
und für neuere Versionen von jquery ist die Funktion prop ("geprüft") anstelle von attr ("geprüft"), falls jemand anderes auffängt.
Danski

Ich würde 'Requisiten' wegen Nicht-Abwärtskompatibilität vermeiden, insb. im IE.
Vapcguy

27

Es gibt eine Problemumgehung , die in jQuery 1.3.2 und 1.4.2 funktioniert :

$("#myCheckbox").change( function() {
    alert($(this).is(":checked"));
});

//Trigger by:
$("#myCheckbox").trigger('click').trigger('change');​​​​​​​​​​​​​

Aber ich stimme zu, dieses Verhalten scheint im Vergleich zum nativen Ereignis fehlerhaft zu sein.


10

Ab Juni 2016 (unter Verwendung von jquery 2.1.4) funktioniert keine der anderen vorgeschlagenen Lösungen. Das Überprüfen attr('checked')kehrt immer zurück undefinedund is('checked)kehrt immer zurückfalse .

Verwenden Sie einfach die Requisitenmethode:

$("#checkbox").change(function(e) {

  if ($(this).prop('checked')){
    console.log('checked');
  }
});

2
is('checked)wird false zurückgeben, da "geprüft" kein CSS-Pseudo-Selektor ist. Das richtige sollte sein, is(':checked')damit es stattdessen nach ": checked" sucht.
Dhaupin

4

Ich habe dieses Verhalten immer noch mit jQuery 1.7.2. Eine einfache Problemumgehung besteht darin, die Ausführung des Klick-Handlers mit setTimeout zu verschieben und den Browser in der Zwischenzeit seine Magie entfalten zu lassen:

$("#myCheckbox").click( function() {
    var that = this;
    setTimeout(function(){
        alert($(that).is(":checked"));
    });
});

Ja! Ein wenig offtopic, aber ich musste dasselbe in Kendo-Gittern mit Kontrollkästchen tun, wenn jemand auf "Neuen Datensatz hinzufügen" klickte, wenn ich wollte, dass es standardmäßig "Aktiv" ist. Ich musste ihm auch eine Zeit von 500ms geben. Dann musste ich hinzufügen .click(), dann setzen .attr('value', 'true'), dann .change(), .blur()bevor es programmgesteuert die Box setzen würde, wenn ich programmgesteuert auf die Schaltfläche "Aktualisieren" klickte ....
vapcguy

2

Wenn Sie dieses eher unerwünschte Verhalten antizipieren, besteht eine Möglichkeit darin, einen zusätzlichen Parameter aus jQuery.trigger () an den Klick-Handler des Kontrollkästchens zu übergeben. Dieser zusätzliche Parameter soll den Klick-Handler darüber informieren, dass der Klick programmgesteuert ausgelöst wurde, anstatt dass der Benutzer direkt auf das Kontrollkästchen selbst klickt. Der Klick-Handler des Kontrollkästchens kann dann den gemeldeten Prüfstatus invertieren.

So würde ich das Klickereignis für ein Kontrollkästchen mit der ID "myCheckBox" auslösen. Beachten Sie, dass ich auch einen Objektparameter mit einem einzelnen Element, nonUI, übergebe, das auf true gesetzt ist:

$("#myCheckbox").trigger('click', {nonUI : true})

Und so gehe ich damit im Click-Event-Handler des Kontrollkästchens um. Die Handlerfunktion prüft, ob das nonUI-Objekt als zweiter Parameter vorhanden ist. (Der erste Parameter ist immer das Ereignis selbst.) Wenn der Parameter vorhanden und auf true gesetzt ist, invertiere ich den gemeldeten Status .checked. Wenn kein solcher Parameter übergeben wird - was nicht der Fall ist, wenn der Benutzer einfach auf das Kontrollkästchen in der Benutzeroberfläche geklickt hat -, melde ich den tatsächlichen Status .checked:

$("#myCheckbox").click(function(e, parameters) {
   var nonUI = false;
        try {
            nonUI = parameters.nonUI;
        } catch (e) {}
        var checked = nonUI ? !this.checked : this.checked;
        alert('Checked = ' + checked);
    });

JSFiddle-Version unter http://jsfiddle.net/BrownieBoy/h5mDZ/

Ich habe mit Chrome, Firefox und IE 8 getestet.


2
<input id="widget-wpb_widget-3-custom_date" class="mycheck" type="checkbox" value="d/M/y" name="widget-wpb_widget[3][custom_date]" unchecked="true">    

var atrib = $('.mycheck').attr("unchecked",true);
$('.mycheck').click(function(){
if ($(this).is(":checked")) 
{
$('.mycheck').attr("unchecked",false);
   alert("checkbox checked");
}
else
{
$('.mycheck').attr("unchecked",true);
 alert("checkbox unchecked");
}
});

Einige Kommentare wären nett
Danil Gaponov

2
  $("#checkbox").change(function(e) {

  if ($(this).prop('checked')){
    console.log('checked');
  }
});

1
$("#personal").click(function() {
      if ($(this).is(":checked")) {
            alert('Personal');
        /* var validator = $("#register_france").validate(); 
        validator.resetForm(); */
      }
            }
            );

JSFIDDLE


0

Nun, um zum ersten Szenario zu passen, habe ich mir das ausgedacht.

http://jsbin.com/uwupa/edit

Anstatt das "Klick" -Ereignis zu binden, binden Sie im Wesentlichen das "Änderungs" -Ereignis mit der Warnung.

Wenn Sie dann das Ereignis auslösen, lösen Sie zuerst einen Klick und dann eine Änderung aus.


0

Zusätzlich zur Antwort von Nick Craver IE 8müssen Sie dem Kontrollkästchen einen zusätzlichen Klick-Handler hinzufügen , damit dies ordnungsgemäß funktioniert :

// needed for IE 8 compatibility
if ($.browser.msie)
    $("#myCheckbox").click(function() { $(this).trigger('change'); });

$("#myCheckbox").change( function() {
    alert($(this).is(":checked"));
});

//Trigger by:
$("#myCheckbox").trigger('click').trigger('change');

Andernfalls wird der Rückruf nur ausgelöst, wenn das Kontrollkästchen den Fokus verliert, da IE 8Kontrollkästchen und Funkgeräte beim Klicken weiterhin im Fokus bleiben.

Habe aber nicht getestet IE 9.


0
$( "#checkbox" ).change(function() {
    if($(this).is(":checked")){
        alert('hi');
    }

});

1
Bitte erwähnen Sie einige Details
CodeWarrior

Dies scheint nur eine wiederholte Antwort zu sein, die changeanstelle der OPs verwendet wird click, und verwendet lediglich eine ifAnweisung als eine andere Art des Testens :checked.
Vapcguy

-1

Schnellster und einfachster Weg :

$('#myCheckbox').change(function(){
    alert(this.checked);
});

$el[0].checked;

$ el - ist ein Abfrageelement der Auswahl.

Genießen!


-2
if ($.browser.msie) {
    $("#myCheckbox").click(function() { $(this).trigger('change'); });
}

$("#myCheckbox").change(function() {
        alert($(this).is(":checked"));
    });
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.