L'approche que je vous présente ci-dessous à travers tous itère fieldset
éléments, et si toutes les entrées qui y sont type="radio"
, les cuirs et éléments span
ajoute (de class="buttonRadio"
) à leur place, en utilisant le texte de leurs éléments label
pertinents. Il se lie également aux éléments span
annexés click
événements et déclenche l'événement change
sur les input
originaux s et ajoute également la « checked » nom de classe à l'élément cliquée/touché, tout en retirant cette classe de son frères et soeurs:
$('fieldset').each(
function() {
var legend = $(this).find('legend').text();
if ($(this).find('input').length == $(this).find('input[type="radio"]').length) {
var that = $(this),
len = that.find('input[type="radio"]').length;
for (var i = 0; i < len; i++) {
$('<span />')
.text($('label')
.eq(i).text())
.addClass('buttonRadio')
.attr('data-fromID',that.find('input:eq(' + i + ')').attr('id'))
.appendTo(that);
}
}
}).on('click','.buttonRadio',function(){
var id = $(this).attr('data-fromID');
$(this).addClass('checked').siblings().removeClass('checked');
$('#' + id).click().trigger('change');
}).find('label, input[type="radio"]').css('display','none');
Il utilise le CSS suivant pour le style de ces éléments:
.buttonRadio {
background-color: #fff;
padding: 0.5em 1em;
border: 1px solid #000;
margin: 0.5em 0 0 0;
}
.buttonRadio.checked {
background-color: #ffa;
}
JS Fiddle demo.
Edité de modifier la jQuery un peu:
- mises en cache l'objet
$(this)
un peu plus tôt dans cette version,
- pensé à utiliser la variable
legend
que j'affecté dans la première incarnation mais j'ai oublié d'utiliser ... soupir.
également caché l'élément <legend></legend>
réel:
$('fieldset').each(
function() {
var that = $(this),
legend = that.find('legend').text();
$('<span />').text(legend).addClass('legend').appendTo(that);
if (that.find('input').length == that.find('input[type="radio"]').length) {
var len = that.find('input[type="radio"]').length;
for (var i = 0; i < len; i++) {
$('<span />')
.text($('label')
.eq(i).text())
.addClass('buttonRadio')
.attr('data-fromID',that.find('input:eq(' + i + ')').attr('id'))
.appendTo(that);
}
}
}).on('click','.buttonRadio',function(){
var id = $(this).attr('data-fromID');
$(this).addClass('checked').siblings().removeClass('checked');
$('#' + id).click().trigger('change');
}).find('label, input[type="radio"], legend').css('display','none');
JS Fiddle demo.
Références:
Assez, avez-vous essayé? Avez-vous trouvé quelque chose à partir d'une recherche? –
J'ai regardé http://jqueryui.com/demos/button/radio.html Je veux vraiment le faire. Pourtant, j'ai ouvert la question pour savoir si c'est un bon choix ou s'il existe de meilleures options disponibles. d'où la question – CuriousMind