Cliquez sur les lignes de la table pour sélectionner la case à cocher en utilisant jQuery

Que je n'ai pas trouvé question posée avant, sur la façon de bascule case cliquez sur une ligne du tableau, donc, je tiens à partager mon approche...

23
demandé sur Mr. Alien 2013-08-18 11:46:01

5 réponses

pour sélectionner la case à cocher d'une rangée à l'intérieur de la table, nous vérifierons d'abord si la case type attribute de l'élément que nous ciblons n'est pas une case à cocher, si ce n'est pas une case à cocher, nous vérifierons toutes les cases à cocher imbriquées à l'intérieur de cette rangée de tableaux.

$(document).ready(function() {
  $('.record_table tr').click(function(event) {
    if (event.target.type !== 'checkbox') {
      $(':checkbox', this).trigger('click');
    }
  });
});

Démo


si vous voulez mettre en évidence la ligne de la table sur checkbox checked que nous pouvons utiliser une condition if avec is(":checked") , si oui, que nous trouvons l'élément tr le plus proche en utilisant .closest() et que nous y ajoutons une classe en utilisant addClass()

$("input[type='checkbox']").change(function (e) {
    if ($(this).is(":checked")) { //If the checkbox is checked
        $(this).closest('tr').addClass("highlight_row"); 
        //Add class on checkbox checked
    } else {
        $(this).closest('tr').removeClass("highlight_row");
        //Remove class on checkbox uncheck
    }
});

Démo

73
répondu Mr. Alien 2013-11-26 18:46:46

cette question m'a été utile, mais j'ai eu un problème avec la solution précédente. Si vous cliquez sur un lien dans une cellule de tableau, il va déclencher la case à cocher inverser. J'ai googlé ceci et j'ai vu une proposition pour ajouter un event.stopPropagation() sur les liens de la table, comme ceci:

$('.record_table tr a').click(function(event) {
  event.stopPropagation();
});

cette solution était une mauvaise idée parce que j'ai eu quelques jQuery bootstrap popover sur un lien de la table...

voici donc une solution qui me convient mieux. Par le chemin que je suis en utilisant bootstrap 2.3, le point culminant de la ligne est fait en ajoutant la classe "info" au tr. Pour utiliser ce code, vous avez juste besoin d'ajouter class="selectable" à la balise table.

$(".selectable tbody tr input[type=checkbox]").change(function(e){
  if (e.target.checked)
    $(this).closest("tr").addClass("info");
  else
    $(this).closest("tr").removeClass("info");
});

$(".selectable tbody tr").click(function(e){
  if (e.target.type != 'checkbox' && e.target.tagName != 'A'){
    var cb = $(this).find("input[type=checkbox]");
    cb.trigger('click');
  }
});

vous voudrez probablement être plus précis avec la condition de test, par exemple si vous avez d'autres entrées dans la rangée.

7
répondu Jérémie 2014-01-20 09:28:50

déclencher un clic comme beaucoup des solutions fournies ci-dessus fera tourner la fonction deux fois. Mettez à jour la valeur prop à la place:

$('tr').click(function(event){
  alert('function runs twice');
  if(event.target.type !== 'checkbox'){
    //$(':checkbox', this).trigger('click');
    // Change property instead
    $(':checkbox', this).prop('checked', true);
  }
});

lien vers jsfiddle exemple ici

3
répondu CR Rollyson 2016-08-01 21:15:53

vous pouvez simplement déclencher cet événement de clic...:)

  $(document).ready(function()
    {
      $("table tr th :checkbox").click(function(event)
      {
        $('tbody :checkbox').trigger('click');
      });
    });

ou

  $(document).ready(function()
    {
      $("table tr th :checkbox").on('click',function(event)
      {
        $('tbody :checkbox').trigger('click');
      });
    });
0
répondu Kalpesh Desai 2016-01-12 11:32:22

même si la réponse acceptée @Mr.Alien fonctionne bien, elle ne fonctionne pas au cas où vous décidez d'ajouter une nouvelle ligne <tr> dynamiquement avec jQuery à un moment donné.

je recommande d'utiliser une approche de délégation d'événement, qui est juste une légère modification de la réponse acceptée.

au lieu de:

... $('.record_table tr').click(function(event) { ...

utiliser

... $('.record_table').on('click', 'tr', function(event) { ...

et le même pour la mise en évidence, utiliser:

... $(".record_table").on('change', "input[type='checkbox']", function (e) { ...

plus d'informations ici: Click event doesn't fire for table rows ajouté dynamiquement

0
répondu WojtylaCz 2016-09-18 20:06:23