64 votes

Evénement Twitter Bootstrap onclick sur les boutons-radio

J'ai une radio-boutons Twitter Bootstrap et j'y branche un événement onclick. Mais comment puis-je vérifier lequel des boutons s’est déclenché?

Ma première pensée était simplement de vérifier la classe 'active', mais cela devrait créer une condition de concurrence critique (le résultat dépend du fait que l'événement Twitter Bootstrap ou mon propre événement onclick soit traité en premier).

76voto

hheimbuerger Points 3156

C'est vraiment gênant. Ce que j'ai utilisé est:

Tout d'abord, créez un groupe de simples boutons sans data-toggle d'attribut.

<div id="selector" class="btn-group">
    <button type="button" class="btn active">Day</button>
    <button type="button" class="btn">Week</button>
    <button type="button" class="btn">Month</button>
    <button type="button" class="btn">Year</button>
</div>

Ensuite, écrire un gestionnaire d'événement qui simule le bouton radio effet par 'activer' l'cliqué sur l'un et "désactiver" tous les autres boutons.

$('#selector button').click(function() {
    $('#selector button').addClass('active').not(this).removeClass('active');

    // TODO: insert whatever you want to do with $(this) here
});

EDIT: Nick a proposé une même version plus propre dans les commentaires ci-dessous:

$('#selector button').click(function() {
    $(this).addClass('active').siblings().removeClass('active');

    // TODO: insert whatever you want to do with $(this) here
});

Si vous êtes d'accord que c'est encore mieux, merci de upvote son commentaire! Je l'ai fait, et je vais utiliser sa version à la place de la mine à partir de maintenant.

23voto

nodrog Points 2564

Je voudrais utiliser un événement de changement pas un clic comme ça:

 $('input[name="name-of-radio-group"]').change( function() {
  alert($(this).val())
})
 

9voto

paulalexandru Points 1402

Pour Bootstrap 3, la structure par défaut du groupe radio / boutons est la suivante:

 <div class="btn-group" data-toggle="buttons">
    <label class="btn btn-primary">
        <input type="radio" name="options" id="option1"> Option 1
    </label>
    <label class="btn btn-primary">
        <input type="radio" name="options" id="option2"> Option 2
    </label>
    <label class="btn btn-primary">
        <input type="radio" name="options" id="option3"> Option 3
    </label>
</div>
 

Et vous pouvez sélectionner l'actif comme ceci:

 $('.btn-primary').on('click', function(){
    alert($(this).find('input').attr('id'));
}); 
 

6voto

mark Points 126

N'utilisez pas l'attribut data-toggle pour pouvoir contrôler vous-même le comportement de bascule. Donc, cela évitera les "conditions de course"

mes codes:

modèle de groupe de boutons (écrit en .erb, ruby intégré pour ruby sur rails):

 <div class="btn-group" id="featuresFilter">
     <% _.each(features, function(feature) { %> <button class="btn btn-primary" data="<%= feature %>"><%= feature %></button> <% }); %>
</div>
 

et javascript:

 onChangeFeatures = function(e){
        var el=e.target;
        $(el).button('toggle');

        var features=el.parentElement;
        var activeFeatures=$(features).find(".active");
        console.log(activeFeatures);
}
 

La fonction onChangeFeatures sera déclenchée une fois le bouton cliqué.

3voto

sled Points 8468

Je devais faire la même chose pour un graphique où vous pouvez sélectionner la période des données à afficher.

Par conséquent, j'ai introduit la classe CSS 'btn-group-radio' et utilisé le javascript one-liner non intrusif suivant:

 // application.js
$(document).ready(function() {
  $('.btn-group-radio .btn').click(function() {
    $(this).addClass('active').siblings('.btn').removeClass('active');
  });
});
 

Et voici le HTML:

 <!-- some arbitrary view -->
<div class="btn-group btn-group-radio">
  <%= link_to '1W', charts_path('1W'), class: 'btn btn-default active', remote: true %>
  <%= link_to '1M', charts_path('1M'), class: 'btn btn-default', remote: true %>
  <%= link_to '3M', charts_path('3M'), class: 'btn btn-default', remote: true %>
  <%= link_to '6M', charts_path('6M'), class: 'btn btn-default', remote: true %>
  <%= link_to '1Y', charts_path('1Y'), class: 'btn btn-default', remote: true %>
  <%= link_to 'All', charts_path('all'), class: 'btn btn-default', remote: true %>
</div>
 

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