49 votes

Bouton radio jQuery UI - comment passer correctement à l'état coché

J'ai un ensemble de boutons radio, tous stylisés avec l'interface utilisateur de jQuery. .button() .

Je veux modifier leur état de vérification. Cependant, lorsque je le fais de manière programmatique sur l'événement change du conteneur avec :

$("#myradio [value=1]").attr("checked", false);
$("#myradio [value=2]").attr("checked", true);

Les valeurs sont modifiées correctement, mais l'interface utilisateur affiche toujours le bouton radio non coché avec le style coché, et le bouton coché semble toujours non coché.

J'ai parcouru la documentation de jQuery UI sur l'onglet button() pour les boutons radio, mais il n'y a rien sur la façon de changer l'état et de mettre à jour le style de l'interface utilisateur.

En résumé, le problème est que l'appel de la fonction $("selector").button("disable"); ne modifie pas l'état actif du bouton. Le bouton radio sous-jacent est correctement coché, mais l'état actif de l'interface utilisateur ne change pas. J'obtiens donc un bouton grisé qui semble toujours coché, et le bouton réellement sélectionné apparaît non coché.

Solution

$("selector").button("enable").button("refresh");

0 votes

Antony, j'ai essayé et le bouton ("enable") ne fonctionne pas pour moi. Cela ne devrait pas être comme $("selector").attr('checked', true).button("refresh") ; ?

60voto

T.J. Crowder Points 285826

Vous devez appeler le refresh après avoir modifié l'état sous-jacent :

Rafraîchit l'état visuel du bouton. Utile pour mettre à jour l'état du bouton après que l'état coché ou désactivé de l'élément natif a été modifié par programme.

Exemple de travail : http://jsbin.com/udowo3

function setRadio(id) {
    var radio = $('#' + id);
    radio[0].checked = true;
    radio.button("refresh");
}

Cela utilise des ID pour les radios, mais cela n'a pas d'importance tant que vous obtenez une instance de jQuery contenant les données pertinentes. input[type=radio] élément.

0 votes

Cela a fonctionné - merci ! Pourquoi dois-je faire cela ? Est-ce un bogue ou un mauvais comportement de jQuery UI ?

0 votes

@Antony : Eh bien, il n'y a pas d'événement fiable, inter-navigateur, lancé lorsque l'état de l'élément checked o disabled est modifié. Ce qui me surprend, c'est qu'ils n'utilisent pas de CSS pour que le navigateur gère le changement automatiquement, mais je suppose qu'ils ont une raison (le support d'IE6, peut-être -- IE6 ne fait pas de sélecteurs d'état sur autre chose que les liens). L'autre surprise est qu'ils ne fournissent pas une méthode que vous pouvez utiliser pour changer l'état de l'élément checked et mettre à jour l'interface utilisateur en une seule fois. Pourtant, c'est assez facile une fois que vous savez :-)

5 votes

Lorsque j'utilise l'appel "refresh", j'obtiens l'erreur suivante : Uncaught Error : cannot call methods on button prior to initialization ; attempted to call method 'refresh'. Avez-vous vu cela / savez-vous pourquoi j'obtiens cette erreur ?

18voto

Salah B Points 101

Malgré les messages qui disent le contraire, vous POUVEZ référencer un bouton radio par ID. Je ne sais pas pourquoi JQuery UI ne rafraîchit pas automatiquement les boutons lorsqu'ils sont cochés, mais vous pouvez le faire comme ceci :

$('selector').attr('checked','checked').button("refresh");

Exemple de travail :

<div id = "buttons">
 <label for="b1">button1</label>
 <label for="b2">button2</label>
 <label for="b3">button3</label>

 <input type="radio" name = "groupa" id = "b1" value="b1">
 <input type="radio" name = "groupa" id = "b2" value="b2">
 <input type="radio" name = "groupa" id = "b3" value="b3">
</div>

<script>
  $('#buttons input').button();     
  $('#b3').prop('checked', true).button("refresh");
</script>

5 votes

Le seul ajout que je ferais ici serait d'utiliser "prop" au lieu de "attr", ce qui donnerait $('selector').prop("checked",true).button("refresh").

0 votes

Lorsque j'essaie d'appliquer ce correctif, j'obtiens l'erreur suivante - Uncaught Error : cannot call methods on button prior to initialization ; attempted to call method 'refresh'. Quelqu'un sait-il quelle est la cause de ce problème ?

1voto

Mike Points 19

Réinitialise tous les boutons radio, mais vous pouvez être plus spécifique avec le sélecteur.

$( 'input:radio' )
     .removeAttr('checked')
     .removeAttr('selected')
     .button("refresh");

2 votes

-1 : Cela ne fonctionnera pas avec jQuery UI button (sur lesquels porte la question) car ils créent des éléments distincts qui ne sont pas liés au bouton radio d'origine. Vous devez appeler button("refresh") après avoir changé l'état du bouton (de préférence avec prop('checked', boolvalue) )

1voto

Tgr Points 11766

En regardant le code vous devez activer l'option ui-state-active mais le moyen le plus simple est sans doute de se contenter de $('someradiobutton').trigger('click') (ou si vous ne voulez pas que vos gestionnaires d'événements personnalisés s'exécutent, $('someradiobutton').trigger('click.button') ).

0 votes

-1 : Cela ne fonctionnera pas avec jQuery UI button (sur lesquels porte la question) car ils créent des éléments distincts qui ne sont pas liés au bouton radio d'origine. Vous devez appeler button("refresh") après avoir changé l'état du bouton (de préférence avec prop('checked', boolvalue) )

0voto

Stefan Brinkmann Points 328

Je l'ai résolu en réinitialisant complètement le Buttonset avec setTimeout.

Ajoutez un événement de clic au bouton radio qui nécessite une confirmation.
Veuillez noter que le "radioButton" cliqué et le "radioSet" complet dans le code ci-dessous :

$('#radioButton').click(function(){
    if(confirm('Confirm Text') != true){
       resetButtonset('#radioSet', 200);
       return false;
    };
});

Créez une fonction pratique qui réinitialise votre Buttonset :

function resetButtonset(name, time){
    setTimeout(function(){$(name).buttonset();}, time);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X