【问题标题】:How to get Indeterminate Checkbox to fire function of other checkboxes?如何让 Indeterminate Checkbox 触发其他复选框的功能?
【发布时间】:2015-08-25 21:10:43
【问题描述】:

我制作了一个表格,其中包含显示和隐藏行的复选框,以便更轻松地比较特定行。我想添加不确定的复选框,以便可以同时选择或不选择多行。它有点工作,因为它检查了它下面的框,但即使它被选中,它也不会触发隐藏或显示行的功能。不过,各个复选框仍会触发该功能。

jsfiddle

使用复选框显示/隐藏行

$('input[type = checkbox]').change(function () {
var valu = $(this).val();
var ischecked = $(this).is(":checked");

if( ischecked ){
    $('.' + valu).show();
}else{
    $('.' + valu).hide();
}
});

部门 1 的不确定复选框

$(document).ready(function () {
var checkboxes = document.querySelectorAll('input.div1'),
checkdiv1 = document.getElementById('checkdiv1');

for(var i=0; i<checkboxes.length; i++) {
checkboxes[i].onclick = function() {
    var checkedCount = document.querySelectorAll('input.div1:checked').length;

    checkdiv1.checked = checkedCount > 0;
    checkdiv1.indeterminate = checkedCount > 0 && checkedCount < checkboxes.length;
}
}

checkdiv1.onclick = function() {
for(var i=0; i<checkboxes.length; i++) {
    checkboxes[i].checked = this.checked;
}
}
});

第 2 部分的不确定复选框

$(document).ready(function () {
var checkboxes = document.querySelectorAll('input.div2'),
checkdiv2 = document.getElementById('checkdiv2');

for(var i=0; i<checkboxes.length; i++) {
checkboxes[i].onclick = function() {
    var checkedCount = document.querySelectorAll('input.div2:checked').length;

    checkdiv2.checked = checkedCount > 0;
    checkdiv2.indeterminate = checkedCount > 0 && checkedCount < checkboxes.length;
}
}

checkdiv2.onclick = function() {
for(var i=0; i<checkboxes.length; i++) {
    checkboxes[i].checked = this.checked;
}
}
});

【问题讨论】:

  • 如果我们的某个答案对您有所帮助,请选择其中一个作为答案。

标签: javascript html checkbox


【解决方案1】:

1) 您需要根据内部复选框添加隐藏/显示行,因此您可以将“更改”事件处理程序绑定到具有“显示”类的复选框。所以,你的代码将是

$('input[type = checkbox].show').change(function () {

而不是

$('input[type = checkbox]').change(function () {

2) 您可以删除第二个 $(document).ready() 函数并将您的代码合并为一个。

$(document).ready(function(){ fun1() });
$(document).ready(function(){ fun2() });

等价于

$(document).ready(function(){ fun1(); fun2(); });

3) 点击外部复选框时,可以触发内部复选框的'change'事件:

$(checkboxes[i]).trigger('change');

$('input[type = checkbox].show').change(function () {
    
    var valu = $(this).val();
    var ischecked = $(this).is(":checked");
    
    if( ischecked ){
        $('.' + valu).show();
    }else{
        $('.' + valu).hide();
    }
});

$(document).ready(function () {
  	var checkboxes = document.querySelectorAll('input.div1');
    var checkdiv1 = document.getElementById('checkdiv1');

    for(var i=0; i<checkboxes.length; i++) {
        checkboxes[i].onclick = function() {
            var checkedCount = document.querySelectorAll('input.div1:checked').length;

            checkdiv1.checked = checkedCount > 0;
            checkdiv1.indeterminate = checkedCount > 0 && checkedCount < checkboxes.length;
        }
    }

    checkdiv1.onclick = function() {
        var checkboxes = document.querySelectorAll('input.div1');
        for(var i=0; i<checkboxes.length; i++) {
            checkboxes[i].checked = this.checked;        
            $(checkboxes[i]).trigger('change');
        }
    }

  	var checkboxes = document.querySelectorAll('input.div2');
    var checkdiv2 = document.getElementById('checkdiv2');

    for(var i=0; i<checkboxes.length; i++) {
        checkboxes[i].onclick = function() {
            var checkedCount = document.querySelectorAll('input.div2:checked').length;

            checkdiv2.checked = checkedCount > 0;
            checkdiv2.indeterminate = checkedCount > 0 && checkedCount < checkboxes.length;
        }
    }

    checkdiv2.onclick = function() {
        var checkboxes = document.querySelectorAll('input.div2');
        for(var i=0; i<checkboxes.length; i++) {
            checkboxes[i].checked = this.checked;
            $(checkboxes[i]).trigger('change');
        }
    }
    
    $('.hideRow').click(function () {
        $('input[value="' + $(this).attr('checkBoxValue') + '"]').trigger('click');
    });
});
.hide{
    visibility: hidden;
}

label {
    display:block
}

label:first-child {
    font-weight:bold;
}

label:nth-child(n+2) {
    margin-left:1em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div>
	<label><input type="checkbox" id="checkdiv1" checked> Division 1</label>
<label><input type="checkbox" class="div1 show" value="d1" checked> Team 1</label>
<label><input type="checkbox" class="div1 show" value="d2" checked > Team 2</label>
<label><input type="checkbox" class="div1 show" value="d3" checked> Team 3</label></div>
<div>
<label><input type="checkbox" id="checkdiv2" checked> Division 2</label>
<label><input type="checkbox" class="div2 show" value="r1" checked> Team 1</label>
<label><input type="checkbox" class="div2 show" value="r2" checked > Team 2</label>
<label><input type="checkbox" class="div2 show" value="r3" checked> Team 3</label></div>
<br>
<hr>
    
<br>
<table border="1">
    <tbody>
    	<tr>            
            <td></td>
            <td >Teams</td>
            <td>Points For</td>
            <td>Points Against</td>
        </tr>
        <tr class="d1">
            <td><button class="hideRow" checkBoxValue="d1">Hide</button></td>
            <td>Division 1 Team 1</td>
            <td>280</td>
            <td>100</td>
        </tr>
        <tr class="d2">
            <td><button class="hideRow" checkBoxValue="d2">Hide</button></td>
            <td>Division 1 Team 2</td>
            <td>225</td>
            <td>150</td>
        </tr>
        <tr class="d3">
            <td><button class="hideRow" checkBoxValue="d3">Hide</button></td>
            <td>Division 1 Team 3</td>
            <td>187</td>
            <td>223</td>
        </tr>
        <tr class="r1">
            <td><button class="hideRow" checkBoxValue="r1">Hide</button></td>
            <td>Division 2 Team 1</td>
            <td>330</td>
            <td>185</td>
        </tr>
        <tr class="r2">
            <td><button class="hideRow" checkBoxValue="r2">Hide</button></td>
            <td>Division 2 Team 2</td>
            <td>267</td>
            <td>225</td>
        </tr>
        <tr class="r3">
            <td><button class="hideRow" checkBoxValue="r3">Hide</button></td>
            <td>Division 2 Team 3</td>
            <td>223</td>
            <td>150</td>
        </tr>
    </tbody>
</table>

【讨论】:

  • 谢谢 Chitrang,我想知道您是否可以再帮我做一件事。我想在每一行的第一列中添加一个按钮,除了取消选中顶部的相应复选框之外,该按钮还可以隐藏该特定行。
  • 更新了添加按钮的答案。
【解决方案2】:

您可以在更改处理程序中完成所有这些操作。您将不得不在一定程度上重新考虑您的标记,但这很简单。我在父复选框中添加了data-targetdata-nodes,在表格行中添加了dr 类。

HTML

<div>
    <label><input type="checkbox" data-target="d" data-nodes=".div1" checked>Division 1</label>
    <label><input type="checkbox" class="div1 show" value="d1" checked>Team 1</label>
    <label><input type="checkbox" class="div1 show" value="d2" checked>Team 2</label>
    <label><input type="checkbox" class="div1 show" value="d3" checked>Team 3</label>
</div>
<div>
    <label><input type="checkbox" data-target="r" data-nodes=".div2"  checked>Division 2</label>
    <label><input type="checkbox" class="div2 show" value="r1" checked>Team 1</label>
    <label><input type="checkbox" class="div2 show" value="r2" checked>Team 2</label>
    <label><input type="checkbox" class="div2 show" value="r3" checked>Team 3</label>
</div>
<br>
<hr>
<br>
<table border="1">
    <tbody>
        <tr>
            <td>Teams</td>
            <td>Points For</td>
            <td>Points Against</td>
        </tr>
        <tr class="d d1">
            <td>Division 1 Team 1</td>
            <td>280</td>
            <td>100</td>
        </tr>
        <tr class="d d2">
            <td>Division 1 Team 2</td>
            <td>225</td>
            <td>150</td>
        </tr>
        <tr class="d d3">
            <td>Division 1 Team 3</td>
            <td>187</td>
            <td>223</td>
        </tr>
        <tr class="r r1">
            <td>Division 2 Team 1</td>
            <td>330</td>
            <td>185</td>
        </tr>
        <tr class="r r2">
            <td>Division 2 Team 2</td>
            <td>267</td>
            <td>225</td>
        </tr>
        <tr class="r r3">
            <td>Division 2 Team 3</td>
            <td>223</td>
            <td>150</td>
        </tr>
    </tbody>
</table>

jQuery

$('input[type = checkbox]').change(function () {
    var nodes = $(this).data("nodes");
    var target = $(this).data("target");
    var valu = $(this).val();
    var ischecked = $(this).is(":checked");

    // If the nodes data attribute exists, use its value
    if (target) {
        valu = target;
    }

    if (ischecked) {
        $('.' + valu).show();
        $(nodes).prop('checked', true);
    } else {
        $('.' + valu).hide();
        $(nodes).prop('checked', false);
    }
});

看到这个小提琴:https://jsfiddle.net/sv59w5m2/2/

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2014-04-10
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多