代码之家  ›  专栏  ›  技术社区  ›  streetparade

限制复选框金额

  •  21
  • streetparade  · 技术社区  · 16 年前

    我有20个复选框。如果选择了4个复选框,我需要禁用16个复选框。

    我用这个jquery代码来尝试这个begann

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

    我需要的是,如果一个用户选择了4个复选框,那么所有其他的复选框都应该被禁用。

    6 回复  |  直到 12 年前
        1
  •  60
  •   Reigel Gallarde    16 年前
    $("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);
    
    });
    

    demo

        2
  •  7
  •   Woody    14 年前

    为父元素提供id为limit_复选框将有助于加快选择速度,缓存查询将减少较慢的DOM交互量。

    使用“更改”而不是单击,否则可以使用键盘绕过代码,也可以使用Live而不是Bind,这要快得多。

    // 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");
        }
    });
    
        3
  •  2
  •   streetparade    16 年前

    这是一个有效的例子。 可能对某些人有用;—)

    $.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);
    
    }
    
        4
  •  1
  •   CupOfJoe    13 年前

    我发现了一个更灵活的解决方案,可以让您改变不同复选框集的限制。

    // 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);
    });
    

    我发现的唯一问题是,如果验证失败并返回带有输入的页面,那么它将允许用户在禁用其余部分之前选择一个额外的框。我解决这个问题的方法是计算检查了多少,并在发送返回输入的页面之前禁用服务器上的其余部分。

    希望它有助于欢呼!

        5
  •  0
  •   Etienne Dupuis    15 年前

    这不会禁用其余的复选框,但会阻止选择更多。我还是会分享,这里是:

    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:确保您使用repeatlayout=“flow”来消除烦人的表格式。

        6
  •  0
  •   Bobz    12 年前

    我的解决方案:

    // 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 );
          });
        });