2008-12-10 4 views
41

Ich jQuerys Toggle Event mit ein paar Sachen zu tun, wenn ein Benutzer eine Checkbox klickt, wie folgt aus:JQuery Toggle-Ereignis wird mit Checkbox Wert Messing

$('input#myId').toggle(
function(){ 
//do stuff 
}, 
function(){ 
//do other stuff  
} 
); 

Das Problem ist, dass das Kontrollkästchen nicht aktiviert wird wenn ich auf das Kontrollkästchen klicke. (Alle Sachen, die ich in die Wechselereignis gesetzt haben ordnungsgemäß funktioniert.)

Ich habe versucht, die folgenden:

$('input#myId').attr('checked', 'checked'); 

und

$(this).attr('checked', 'checked'); 

und sogar einfach

return true; 

Aber nichts funktioniert. Kann mir jemand sagen, wo ich falsch liege?

Bearbeiten - Danke an alle, die geantwortet haben. Dreas 'Antwort hat fast für mich funktioniert, außer für den Teil, der das Attribut überprüft hat. Dies funktioniert perfekt (obwohl es ein bisschen hacky ist)

$('input#myInput').change(function() 
{ 
    if(!$(this).hasClass("checked")) 
    { 
     //do stuff if the checkbox isn't checked 
     $(this).addClass("checked"); 
     return; 
    } 

    //do stuff if the checkbox isn't checked 
    $(this).removeClass('checked'); 
}); 

Vielen Dank noch einmal an alle, die geantwortet haben.

+0

im Browser physisch zeigt es ist nicht so überprüft werden, wenn Sie darauf klicken, oder nur Ihre Veranstaltung Brennen nicht wahr? –

+0

Das Ereignis wird korrekt ausgelöst und der richtige Code wird ausgeführt, aber das Kontrollkästchen wird nicht überprüft! Wenn ich die Werte aus dem Formular verbuche, wird der Wert des Kontrollkästchens nicht durch beide gepostet. –

+1

Anstatt addClass, hasClass und removeClass zu verwenden, verwenden Sie toggleClass. – Ballsacian1

Antwort

52

Verwenden Sie das change Ereignis statt des toggle Ereignis, wie solche:

$('input#myId').change(function() { 
    if ($(this).attr("checked")) { 
     //do the stuff that you would do when 'checked' 

     return; 
    } 
    //Here do the stuff you want to do when 'unchecked' 
}); 
+0

Vielen Dank für Ihre Eingabe, aber ich musste Klassen hinzufügen und entfernen, anstatt die Attribute zu überprüfen - aus irgendeinem Grund konnte ich nicht so richtig funktionieren. Ich werde die vollständige Lösung (zumindest was für mich funktionierte) oben veröffentlichen. Danke noch einmal! –

+0

Ich habe mich immer gefragt den praktischen Unterschied zwischen == und === ... was ist mit diesem Vergleich macht === notwendig? –

+1

Die '==' führt die Typenzerzwingung (Konvertierung) durch, was bedeutet, dass der Compiler implizit versucht, die Werte zu konvertieren. Zum Beispiel [1 == true // true], weil es das 'true' in eine 1 umwandelt ... aber [1 === true // false], weil eine Zahl ungleich boolean –

1
$('input#myId').toggle(
    function(e){ 
    e.preventDefault(); 
    //do stuff  
    $(this).attr('checked', 'true'); 
    }, 
    function(e){ 
    e.preventDefault(); 
    //do other stuff   
    $(this).attr('checked', 'false'); 
    } 
); 
18

Während der Verwendung des change Event-Handler von Dreas Grech vorgeschlagen angemessen ist, es funktioniert nicht gut in IE 6 & 7, die das Ereignis change nicht auslöst, bis der Fokus unscharf ist (dh, bis Sie außerhalb des Bereichs des Kontrollkästchens klicken). Wie QuirksMode sagen, "es ist ein ernsthafter Fehler".

Möglicherweise möchten Sie die click Event-Handler verwenden, aber das wird nicht mit Tastaturnavigation funktionieren. Sie müssen auch einen keyup Handler registrieren ...

Siehe auch this related question.

Ich habe noch keine gute Cross-Browser-Lösung gefunden, die sowohl Mausklicks als auch Tastaturaktivierung der Checkboxen unterstützt (und nicht zu viele Ereignisse auslöst).


In Bezug auf Ihre Lösung zum Prüfen, ob das Kontrollkästchen aktiviert ist oder nicht, stattdessen Ihre eigenen checked Klasse hinzuzufügen, können Sie checked Attribut HTML ist verwenden:

$('input#myInput').change(function() { 
    if ($(this).attr("checked")) { 
     //do stuff if the checkbox is checked 
    } else { 
     //do stuff if the checkbox isn't checked 
    } 
}); 

Jeder Browser das checked Attribut eines Sets input Element auf den Wert "checked", wenn das Kontrollkästchen aktiviert ist, und setzt es auf null (oder löscht das Attribut), wenn das Kontrollkästchen nicht aktiviert ist.

0

habe ich einen ähnlichen Ansatz, sondern einfach das Attribut checked mit wie

//toggles checkbox on/off 
    $("input:checkbox").change(
     function(){ 
      if(!this.checked){ 
      this.checked=true; 
      } 
      else{ 
      this.checked=false; 
      } 
     } 
     ); 
//end toggle 
0

Versuchen Sie, eine nicht-Jquery-Funktion:

function chkboxToggle() { 
    if ($('input#chkbox').attr('checked')) 
    // do something 
    else 
    // do something else 
} 

dann in der Form:

<input id="chkbox" type="checkbox" onclick="chkboxToggle()" /> 
2

Dies ist eine Antwort von MorningZ (ich fand es here), die völlig Sinn macht:

Das Teil ist Sie vermissen, dass „Checkbox“ ein jQuery-Objekt, kein Checkbox DOM-Objekt

so:

checkbox.checked sicher Fehler würde, weil es keine .checked Eigenschaft eines jQuery Objekt

so:

checkbox[0].checked seit dem ersten Elemente auf einem jQuery-Array arbeiten würde, ist das DOM-Objekt i selbst.

Also in Ihrem change() Funktion Sie

$(this)[0].checked 
+2

oder this.checked – soniiic

1

dies für mich gearbeitet können ............ überprüfen es

$(":checkbox").click(function(){ 
if($(this).attr("id").split("chk_all")[1]) 
{ 
    var ty = "sel"+$(this).attr("id").split("chk_all")[1]+"[]"; 
    if($(this).attr("checked")) 
    { 
    $('input[name="'+ty+'"]').attr("checked", "checked"); 
    } 
    else 
    { 
    $('input[name="'+ty+'"]').removeAttr("checked"); 
    } 
} 
}) 
0

Versuchen:

$(":checkbox").click(function(){ 
    if($(this).attr("checked")) 
    { 
    $('input[name="name[]"]').attr("checked", "checked"); 
    } 
    else 
    { 
    $('input[name="name[]"]').removeAttr("checked"); 
    } 
}) 
8

Warum nicht $ .is() verwenden?

$('input#myId').change(
    function() { 
     if ($(this).is(':checked')) { 
      // do stuff here 
     } else { 
      // do other stuff here 
     } 
}); 
0
$("input[type=checkbox][checked=false]")// be shure to set to false on ready 
    $("input#Checkbox1").change(function() { 
     if ($(this).attr("checked")) { 
      $("#chk1").html("you just selected me")//the lable 
     } else {$("#chk1").html("you just un selected me") }  
    }); 
+0

funktioniert für mich und ich verwende es zu überprüfen, bevor einige Logik angewendet wird.Sehr praktisch, um Benutzerfeedback bereitzustellen – philljohn