如何在 HTML 中实现“全选”复选框?

IT技术 javascript html checkbox selectall
2021-01-13 11:58:07

我有一个带有多个复选框的 HTML 页面。

我还需要一个名为“全选”的复选框。当我选中此复选框时,必须选中 HTML 页面中的所有复选框。我怎样才能做到这一点?

6个回答
<script language="JavaScript">
function toggle(source) {
  checkboxes = document.getElementsByName('foo');
  for(var checkbox in checkboxes)
    checkbox.checked = source.checked;
}
</script>

<input type="checkbox" onClick="toggle(this)" /> Toggle All<br/>

<input type="checkbox" name="foo" value="bar1"> Bar 1<br/>
<input type="checkbox" name="foo" value="bar2"> Bar 2<br/>
<input type="checkbox" name="foo" value="bar3"> Bar 3<br/>
<input type="checkbox" name="foo" value="bar4"> Bar 4<br/>

更新:

for each...in构造似乎不起作用,至少在这种情况下,在 Safari 5 或 Chrome 5 中。此代码应该适用于所有浏览器:

function toggle(source) {
  checkboxes = document.getElementsByName('foo');
  for(var i=0, n=checkboxes.length;i<n;i++) {
    checkboxes[i].checked = source.checked;
  }
}
好吧,由于我的编辑因某种原因被拒绝,我想我会在这里发表评论。for-each 构造已被弃用,将无法工作!您必须使用它的替代品:for(let checkbox of checkboxes).
2021-03-11 11:58:07
切勿for in与集合或数组一起使用
2021-03-19 11:58:07
你为什么要做, n=checkboxes.length;i<n而不是仅仅i < checkboxes.length无论如何,要使函数通用(代码重用),请传递一个附加参数:(source, checkboxes_name)并执行document.getElementsByName(checkboxes_name);它比硬编码名称并使函数特定于一组特定的复选框要好。
2021-03-20 11:58:07
@HelloWorld:对于每个...in 实际上是有效的 Javascript:developer.mozilla.org/en/Core_JavaScript_1.5_Reference/...但是,正如 porneL 指出的那样,这是一个晦涩的结构。此外,此代码在 Safari 5 或 Chrome 5 中不起作用。它适用于 FF 3.6 和 IIRC,它适用于 Safari 4。for(var i in checkboxes) checkboxes[i].checked = source.checked适用于所有浏览器。
2021-03-21 11:58:07
对于每个(复选框中的变量复选框) --------------------------------------- 应该:对于(复选框中的 var 复选框)
2021-04-05 11:58:07

使用jQuery

// Listen for click on toggle checkbox
$('#select-all').click(function(event) {   
    if(this.checked) {
        // Iterate each checkbox
        $(':checkbox').each(function() {
            this.checked = true;                        
        });
    } else {
        $(':checkbox').each(function() {
            this.checked = false;                       
        });
    }
}); 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="checkbox" name="checkbox-1" id="checkbox-1" />
<input type="checkbox" name="checkbox-2" id="checkbox-2" />
<input type="checkbox" name="checkbox-3" id="checkbox-3" />

<!-- select all boxes -->
<input type="checkbox" name="select-all" id="select-all" />

如果你想省略 if 和 else 并且仍然处理取消选择,你可以这样做: var state = this.checked; $(':checkbox').each(function() { this.checked = state; });
2021-03-15 11:58:07
您可以将其简化为$(':checkbox').prop('checked', true);$(':checkbox').prop('checked', false);
2021-03-15 11:58:07
我会添加一个 else 子句来处理取消选择用例,;-) .. else { // 迭代每个复选框 $(":checkbox").each(function() { this.checked = false; }); }
2021-04-06 11:58:07

我不确定有人没有以这种方式回答(使用jQuery):

  $( '#container .toggle-button' ).click( function () {
    $( '#container input[type="checkbox"]' ).prop('checked', this.checked)
  })

它很干净,没有循环或 if/else 子句,很有魅力。

稍微修改为:$('#container').on('click', 'toggle-button', function () {...})性能更高,因为 jQuery 只需要从内部#container而不是整个 DOM 中侦听单击事件在文档中查看更多信息:api.jquery.com/on
2021-03-31 11:58:07

这是一种不同的方式,更少的代码

$(function () {
       $('#select-all').click(function (event) {
          
           var selected = this.checked;
           // Iterate each checkbox
           $(':checkbox').each(function () {    this.checked = selected; });

       });
    });

我很惊讶没有人提到document.querySelectorAll()纯 JavaScript 解决方案,适用于 IE9+。

function toggle(source) {
    var checkboxes = document.querySelectorAll('input[type="checkbox"]');
    for (var i = 0; i < checkboxes.length; i++) {
        if (checkboxes[i] != source)
            checkboxes[i].checked = source.checked;
    }
}
<input type="checkbox" onclick="toggle(this);" />Check all?<br />

<input type="checkbox" />Bar 1<br />
<input type="checkbox" />Bar 2<br />
<input type="checkbox" />Bar 3<br />
<input type="checkbox" />Bar 4<br />

这在 Chrome 中有效,但由于不同的原因我有很多复选框,所以我没有定位 'type="checkbox"',而是定位 'name="myobject"' 并且它也有效。
2021-03-12 11:58:07
也许这应该改为新的正确答案,如果不是一些讨论会有所帮助。:-)
2021-03-14 11:58:07
这个答案比其他答案更容易实现到现有页面中。做得好。
2021-03-23 11:58:07