2013-04-05 3 views
11

Ich habe versucht, Radiobuttons mit jQuery programmatisch auszuwählen, etwas, von dem ich dachte, es wäre so einfach wie das Ändern des geprüften Attributs.Gibt es einen Fehler mit Radiobuttons in jQuery 1.9.1?

Der folgende Code scheint jedoch nicht das zu tun, was in jQuery 1.9.1 in Chrome/Firefox erwartet wird.

Erwartetes Verhalten: Klicken Sie auf das div um das Optionsfeld -> 'checked' Attribut wird gesetzt -> Renders im DOM markiert.

Tatsächliches Verhalten: Klicken Sie auf das div um das Optionsfeld -> 'checked' Attribut wird gesetzt -> rendert im DOM für die erste und zweite Schaltfläche angeklickt, nachfolgende Schaltflächen werden nicht wie markiert dargestellt.

jQuery:

$('div.form-type-radio').on('click', function() {  
    var Id = $(this).find('input[type=radio]').attr('id'); 
    $('form input[type=radio]:not(#'+Id+')').removeAttr('checked'); 
    $('#' + Id).attr('checked', 'checked');  
    console.log($('#' + Id));  
}); 

Hier ist ein jsFiddle - http://jsfiddle.net/GL9gC/

ich den gleichen Code mit früheren Versionen von jQuery versucht haben und alles funktioniert wie erwartet.

+1

Nicht, dass es etwas damit zu tun hat, aber warum zum Teufel würden Sie das Element erhalten , dann die ID und ein paar Zeilen darunter verwenden die ID, um das Element wieder zu bekommen? ('Nicht' arbeitet auch mit Elementen). Deine gesamte Funktion könnte einfach '$ ('input [type = radio]', this) sein .prop ('checked', true);' – adeneo

+0

Das war nur übrig von Kopf kratzen und Debuggen, nur absolut sicher, dass ich hatte die ID. – Simon

Antwort

20

In diesem Fall sollten Sie prop() anstelle von attr()/removeAttr() verwenden.

Hier ist eine funktionierende jsFiddle.

jQuery:

$('div.form-type-radio').on('click', function() { 
    var Id = $(this).find('input[type=radio]').prop('id'); 
    $('form input[type=radio]:not(#'+Id+')').prop('checked'); 
    $('#' + Id).prop('checked', 'checked'); 
    console.log($('#' + Id)); 
}); 
+4

Danke, ich denke, ich hätte das lesen sollen (jQuery docs) :: "Dennoch ist das wichtigste Konzept, das man sich über das checked-Attribut merken muss, dass es nicht der checked-Eigenschaft entspricht. Das Attribut entspricht tatsächlich defaultChecked Eigenschaft und sollte nur verwendet werden, um den Anfangswert der Checkbox zu setzen.Der Wert des checked-Attributs ändert sich nicht mit dem Status der Checkbox, während die checked-Eigenschaft.Deshalb ist die Cross-Browser-kompatible Weise zu bestimmen, ob eine Checkbox ist überprüft wird die Eigenschaft " – Simon

+0

Ich bin verrückt geworden, da ich nicht verstehen konnte, warum attr nicht für ein Projekt mit 2.1.4 arbeitete. Gut zu wissen. –