Ответ 1
$("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);
});
У меня есть 20 флажков. Мне нужно отключить 16 флажков, если выбрано 4 флажка.
Я попробовал это с помощью этого кода 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);
});
Предоставление родительского элемента с идентификатором limit_checkbox поможет ускорить выбор, кеширование запроса уменьшает объем взаимодействия DOM, который медленный.
Используется "change" вместо щелчка, иначе код можно обойти, используя клавиатуру, а также использовать 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);
});
Единственная проблема, которую я обнаружил, заключалась в том, что если ваша проверка не удалась и возвращает страницу со входом, она позволит пользователю выбрать один дополнительный флажок перед отключением остальных. Способ, которым я решил это, состоял в том, чтобы подсчитать, сколько из них было проверено и отключить остальные на сервере, прежде чем отправить страницу со входом назад.
надеюсь, что это поможет Cheers!
Это не отключает остальные флажки, но не позволяет выбрать больше. Я все равно поделюсь, вот он:
.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 );
});
});