#jquery #forms #checkbox
#jquery #формы #флажок
Вопрос:
Я использую jQuery, и у меня есть приведенный ниже HTML-код с флажками в нем. У меня есть один главный флажок, вызываемый chkSelectAll
, и дочерние флажки внутри DIV.
<div class="selectallitems">
<div class="selectall">
<asp:CheckBox ID="chkSelectAll" CssClass="selectall-txt" runat="server" />
</div>
<div id="divCheckAll">
<div class="selectall">
<asp:CheckBox ID="chkItemLists" CssClass="selectall-txt-1" runat="server" />
<div class="clear">
</div>
</div>
<br />
<div class="selectall">
<asp:CheckBox ID="chkComponentLinks" CssClass="selectall-txt-1" runat="server" />
<div class="clear">
</div>
</div>
<br />
<div class="selectall">
<asp:CheckBox ID="chkResourceKeyData" CssClass="selectall-txt-1" runat="server" /></div>
<br />
</div>
</div>
Теперь я хочу, чтобы всякий раз, когда пользователь выбирает, chkSelectAll
тогда он должен устанавливать все остальные флажки, и всякий раз, когда пользователь снимает любой из них, он должен снимать chkSelectAll
также, как если все три флажка снова будут установлены, тогда chkSelectAll
также будут установлены, и если все три не выбраны, то главный флажок chkSelectAll
также будет снят.
Пожалуйста, предложите!!
Ответ №1:
Это оптимизированная и более компактная версия. Остальные должны работать нормально, но они все время запускают селекторы без необходимости. Здесь все селекторы сохраняются в начале.
var $selectAll=$('#chkSelectAll'),
$checks=$('#divCheckAll :checkbox');
$selectAll.change(function () {
$checks.attr('checked', this.checked);
});
$checks.change(function () {
$selectAll.attr('checked', $checks.not(':checked').length==0);
});
Ответ №2:
Для моего приложения я использовал что-то вроде этого:
// This would select / deselect all.
$('#chkSelectAll').change(function() {
$('.selectall-txt-1').attr('checked', this.checked);
});
Для основного флажка выбора вы могли бы использовать что-то вроде этого:
$('.selectall-txt-1').change(function() {
var checkedAll = $('.selectall-txt-1 :checked').length == $('.selectall-txt-1').length;
$('#chkSelectAll').attr('checked', checkedAll);
});
Комментарии:
1. спасибо @enoyhsm, но это приведет только к выбору и отмене выбора в соответствии с главным флажком, однако я хочу, чтобы, если пользователь снял какой-либо из дочерних флажков, тогда главный флажок также должен быть снят, и то же самое, если пользователь снова установит все три флажка, тогда главный флажок автоматически будет установлен снова.
2. Обновлен ответ. Необходимо перепроверить, весь ли синтаксис в порядке. Но идея правильная.
Ответ №3:
Я придумал это:
// Master checkbox
$(".selectall input[type=checkbox]").change(function() {
$("#divCheckAll input[type=checkbox]").attr("checked", this.checked);
});
// Child checkboxes
$("#divCheckAll input[type=checkbox]").change(function() {
var isAllChecked = $(".selectall input[type=checkbox]:checked").length == 3;
$(".selectall input[type=checkbox]").attr("checked", isAllChecked);
});
Комментарии:
1. то, что вы пытаетесь сделать здесь, поскольку этот код у меня не работает. Код главного флажка в порядке, что насчет дочерних флажков
2. Я проверяю, есть ли у нас 3 отмеченных дочерних флажка. Если true, мы устанавливаем флажок masetr chcekbox, если false, мы снимаем флажок master.
Ответ №4:
Это очень похоже на ответ Олега Г., за исключением того, что длина не задана жестко, я использую removeAttr, чтобы снять флажок, и я использую отличный :checkbox
селектор jQuery:
$.masterCheck = function(master, boxes) {
master.change(function() {
if (master.is(':checked'))
boxes.attr('checked', 'checked')
else
boxes.removeAttr('checked')
});
boxes.change(function() {
if (boxes.is(':not(:checked)'))
master.removeAttr('checked')
else
master.attr('checked', 'checked')
});
};
$.masterCheck($('.selectall:checkbox'), $('#divCheckAll:checkbox'));