【发布时间】:2011-02-27 07:49:16
【问题描述】:
我有 20 个复选框。如果选择了 4 个复选框,我需要禁用 16 个复选框。
我尝试从这个 jquery 代码开始
$("input[type=checkbox][name=cate]:checked").each(
function()
{
}
);
我需要的是,如果用户选择了 4 个复选框,那么应该禁用所有其他复选框。
【问题讨论】:
我有 20 个复选框。如果选择了 4 个复选框,我需要禁用 16 个复选框。
我尝试从这个 jquery 代码开始
$("input[type=checkbox][name=cate]:checked").each(
function()
{
}
);
我需要的是,如果用户选择了 4 个复选框,那么应该禁用所有其他复选框。
【问题讨论】:
$("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);
});
【讨论】:
提供一个 id 为 limit_checkbox 的父元素将有助于加快选择速度,缓存查询减少了缓慢的 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");
}
});
【讨论】:
这是一个工作示例。 可能对某些人有用;-)
$.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);
}
【讨论】:
我找到了一个更灵活的解决方案,可以让您改变不同复选框集的限制。
// 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);
});
我发现的唯一问题是,如果您的验证失败并返回带有输入的页面,它将让用户在禁用其余框之前选择一个额外的框。我解决这个问题的方法是在发送带有输入的页面之前计算有多少被检查并禁用服务器上的其余部分。
希望它可以帮助干杯!
【讨论】:
这不会禁用剩余的复选框,但会阻止选择更多。无论如何我都会分享,这里是:
.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" 来摆脱烦人的表格格式。
【讨论】:
我的解决方案:
// 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 );
});
});
【讨论】: