Limite Case quantité

J'ai 20 cases à cocher. Je dois désactiver 16 cases à cocher, si 4 cases à cocher sont sélectionnées.

J'ai essayé ce begann avec ce code jquery

    $("input[type=checkbox][name=cate]:checked").each(

    function()
    {
    }

);

Ce dont j'ai besoin, c'est que si un utilisateur sélectionne 4 cases à cocher, toutes les autres cases à cocher doivent être désactivées.

21
demandé sur streetparade 2010-06-03 17:30:55

6 réponses

$("input[type=checkbox][name=cate]").click(function() {

    var bol = $("input[type=checkbox][name=cate]:checked").length >= 4;     
    $("input[type=checkbox][name=cate]").not(":checked").attr("disabled",bol);

});

Démo

60
répondu Reigel 2010-06-03 14:11:37

Fournir un élément parent avec un id de limit_checkbox aidera à accélérer la sélection, la mise en cache de la requête réduit la quantité D'interaction DOM qui est lente.

Utilisé "change" au lieu de click sinon le code pourrait être contourné en utilisant le clavier, en utilisant également live au lieu de bind qui est beaucoup plus rapide.

// Cache jQuery selection
var $checkboxes_to_limit = $("#limit_checkbox").find("input:checkbox[name=cate]");
$checkboxes_to_limit.live("change", function() {
    if($checkboxes_to_limit.filter(":checked").length >= 4) {
        $checkboxes_to_limit.not(":checked").attr("disabled","disabled");
    }
    else {
        $checkboxes_to_limit.removeAttr("disabled");
    }
});
7
répondu Woody 2012-04-16 20:42:47

Voici un exemple de travail. Peut-être que ce serait utile pour certaines personnes ; -)

$.fn.limit = function(n) {
 var self = this;
 this.click(function(){
   (self.filter(":checked").length==n)?
     self.not(":checked").attr("disabled",true).addClass("alt"):
     self.not(":checked").attr("disabled",false).removeClass("alt");
 });
}

$("input:checkbox").limit(3);

}
2
répondu streetparade 2010-06-03 14:01:56

J'ai trouvé une solution plus flexible qui vous permet de varier la limite pour différents ensembles de cases à cocher.

// Assign a class of limit_checkbox to the containing DIV and
// set a data-limit attribute with your limit. 
$(".limit_checkbox").on("change", function()
{
  var limit = $(this).attr('data-limit'),
      checkboxes = $(this).find("input:checkbox"),
      valid = checkboxes.filter(":checked").length >= limit;

    checkboxes.not(":checked").attr("disabled", valid);
});

Le seul problème que j'ai trouvé était que si votre validation échoue et renvoie la page avec l'entrée, il permettra à l'utilisateur de sélectionner une case supplémentaire avant de désactiver le reste. La façon dont j'ai résolu cela était de compter combien ont été vérifiés et désactiver le reste sur le serveur avant d'envoyer la page avec l'entrée de retour.

J'espère que cela aide les acclamations!

1
répondu CupOfJoe 2013-05-09 16:31:15

Cela ne désactive pas les cases à cocher restantes, mais empêche de sélectionner plus. Je vais partager quand même, le voici:

.aspx

<asp:CheckBoxList id="chkList" runat="server" RepeatLayout="Flow" />

.js

$(document).ready(function () {
    LimitCheckboxes('input[name*=chkList]', 3);
}



function LimitCheckboxes(control, max) {

    $(control).live('click', function () {

        //Count the Total Selection in CheckBoxList 
        var totCount = 1;
        $(this).siblings().each(function () {
            if ($(this).attr("checked")) { totCount++; }
        });

        //if number of selected item is greater than the max, dont select.
        if (totCount > max) { return false; }
        return true;
    });

}

PS: assurez-vous d'utiliser le RepeatLayout="Flow" pour vous débarrasser du format de table ennuyeux.

0
répondu Etienne Dupuis 2011-04-13 15:48:21

Ma solution:

// Function to check and disable checkbox
    function limit_checked( element, size ) {
      var bol = $( element + ':checked').length >= size;
      $(element).not(':checked').attr('disabled',bol);
    }

    // List of checkbox groups to check + number of checked alowed
    var check_elements = [
      { id: '.group1 input[type=checkbox]', size: 2 },
      { id: '.group2 input[type=checkbox]', size: 3 },
    ];

    // Run function for each group in list
    $(check_elements).each( function(index, element) {
      // Limit checked on window load
      $(window).load( function() {
        limit_checked( element.id, element.size );
      })

      // Limit checked on click
      $(element.id).click(function() {
        limit_checked( element.id, element.size );
      });
    });
0
répondu Bobz 2014-07-29 09:44:44