【问题标题】:select/deselect all check boxes on click a single check box by javascript通过javascript单击单个复选框时选择/取消选择所有复选框
【发布时间】:2016-01-28 18:48:23
【问题描述】:

我有一个表格,其中有两个包含一些行的表格。

我希望当我点击 select/unselect all 复选框时,该复选框下的复选框应该检查该特定表

我有一个可以工作的 javascript 函数,但是当我单击两个 选择/取消选择所有复选框 中的任何一个时,两个表的复选框都会被选中。 我只想检查特定表的所有复选框。

Javascript:

<script type="text/javascript">
checked=false;
function checkedAll (frm1) {
    var aa= document.getElementById('frm1');
     if (checked == false)
          {
           checked = true
          }
        else
          {
          checked = false
          }
    for (var i =0; i < aa.elements.length; i++) 
    {
     aa.elements[i].checked = checked;
    }
      }

      //function for subscription month


</script>

我的 html 是....

<form action="" method="post" name="frm1" id="frm1">

<table>
<tr><th>Cause List</th></tr>
<?php 
foreach($arr as $month)
{
?>
<tr><td><input type="checkbox" name="causelist_month" /><?php echo $month; ?></td></tr>
<?php } ?>
<tr><th><input type="checkbox" name="causelist_month" id="causelist_month" onclick="checkedAll (frm1);"/>select all/unselect all</th></tr>
</table>
<table>
<tr><th>Subscription</th></tr>
<?php 
foreach($arr as $month)
{
?>
<tr><td><input type="checkbox" name="subscription_month"/><?php echo $month; ?></td></tr>
<?php } ?>
<tr><th><input type="checkbox" name="subscription_month" id="subscription_month" onclick="checkedAll2 (frm2);"/>select all/unselect all</th></tr>
</table>
</form>

请帮帮我。

【问题讨论】:

  • 如果将aa.elements[i].checked = checked 更改为aa.elements[i].checked = true 会怎样?
  • 原因列表
    全选/取消全选
  • 您似乎只有一个表格。为什么第二张桌子不在frm2里面?

标签: javascript dom


【解决方案1】:

使用 jQuery 1.6+,你可以做到

$('.check-all').click(function () {
    var checked = this.prop('checked');   
    this.closest('table').find(':checkbox').prop('checked', checked);
}

其中check-all 是两个“全选/取消全选” 复选框所具有的类。

【讨论】:

  • OP 没有用 jQuery 标记问题。来自 JavaScript 标记描述:“除非还包含框架/库的标记,否则需要纯 JavaScript 答案。”
【解决方案2】:

您的代码存在一些问题。最重要的是,您是一个单独的 checked 变量,用于跟踪 both 表单的状态。那是行不通的。相反,对其他复选框使用“checkall”复选框的状态。

假设你真的有两种形式(如果你不能使用两种形式,见下文):

<form action="" method="post" name="frm1" id="frm1">
    <table>    
        <tr><th>Cause List</th></tr>
        <!-- ... -->
        <tr>
            <th>
                <input type="checkbox" name="causelist_month" id="causelist_month" onclick="checkedAll.call(this);"/>select all/unselect all
            </th>
        </tr>  
    </table>
</form>

<form action="" method="post" name="frm2" id="frm2">
    <table>    
        <tr><th>Subscription List</th></tr>
        <!-- ... -->
        <tr>
            <th>
                <input type="checkbox" name="subscription_month" id="subscription_month" onclick="checkedAll.call(this);"/>select all/unselect all
            </th>
        </tr>  
    </table>
</form>

请注意,我将内联事件处理程序更改为 checkedAll.call(this)

那么你的函数应该是这样的:

function checkedAll() {
    // this refers to the clicked checkbox
    // find all checkboxes inside the checkbox' form
    var elements = this.form.getElementsByTagName('input');
    // iterate and change status
    for (var i = elements.length; i--; ) {
        if (elements[i].type == 'checkbox') {
            elements[i].checked = this.checked;
        }
    }
}

DEMO

当然有改进代码的方法。例如,如果取消选择表中的其他复选框,您可能希望添加逻辑以取消选择相应的“全选”复选框。

我还建议阅读伟大的introduction to event handling on quirksmode.org,以了解绑定事件处理程序的其他方式。


如果您不能使用两种形式,则必须找到另一个祖先作为参考点(即从中选择所有复选框)。在这种情况下,table 元素似乎更可取。您必须遍历文档,直到找到它。 内联点击事件处理程序仍需更改为 checkedAll.call(this) 才能正常工作:

function checkedAll() {
    // this refers to the clicked checkbox

    // find closest table
    var parent = this.parentNode;
    do {
        parent = parent.parentNode;
    } while(parent.nodeName !== 'TABLE');

    // find all checkboxes inside the checkbox' table
    var elements = parent.getElementsByTagName('input');

    // ... continue like shown above
}

【讨论】:

    【解决方案3】:

    您的代码正在更改 frm1 内的所有复选框。在两个单独的 div 中保留两个表,并将相应的 div id 传递给 checkedAll function 。

    <form action="" method="post" name="frm1" id="frm1"> 
    <div id="div1">
    <table>  
       <tr>
             <th>Cause List</th>
      </tr>
      <?php foreach($arr as $month) { ?> 
       <tr><td><input type="checkbox" name="causelist_month" />
       <?php echo $month; ?></td></tr> 
       <?php } ?> 
       <tr>
       <th>
        <input type="checkbox" name="causelist_month" id="causelist_month" onclick="checkedAll (div1);"/>select all/unselect all</th></tr> </table>  
       </div>
       <div id="div2">
       // Second table
       </div>  
      </form>
    

    【讨论】:

    • 为此,事件处理程序也必须更改。
    【解决方案4】:

    试试这个

    function checkedAll(frm1) {
      var chk = document.getElementsByTagName('input');
      for(var i=0; i < chk.length; i++) {
        if(chk[i].type == 'checkbox') {
          chk[i].checked = frm1.checked;
        }
      }
    }
    

    或者您可以找到更多详细信息here

    【讨论】:

    • document.getElementsByTagName('input') 将在整个页面上找到 all input 元素!
    • 在纯 javascript 中没有任何方法可以直接找到复选框。获取输入字段后需要检查其类型为“复选框”,即 if(chk[i].type == 'checkbox')。
    • 我不是这个意思。您正在迭代页面的所有复选框,而 OP 只想迭代各个表的框。
    • 我明白了;在这里,我提出了 OP 可以遵循的逻辑。我想他能从中得到一个想法:)
    【解决方案5】:

    试试这个 --

    $(input[type=checkbox]').attr('checked', 'checked');
    

    HTML -

    <div><label><input id="ChkAll" type="checkbox" onchange="javascript:CheckedAll();" /><span>SelectAll</span></label></div> 
     <div id="DivChk ">
        <label><input type="checkbox" /><span>First</span></label>
        <label><input type="checkbox" /><span>2nd</span></label>
        <label><input type="checkbox" /><span>3rd</span></label>
        <label><input type="checkbox" /><span>4th</span></label>
    </div>
    

    我的 Jquery -

    function CheckedAll(){
         if ($('#ChkAll').is(':checked')) {
              $('#DivChk input[type=checkbox]').attr('checked', 'checked');           
         }
         else {
              $('#DivChk input[type=checkbox]:checked').removeAttr('checked');
         }
       }
    

    Try This using Jquery

    通过 Javascript -

    function CheckedAll(){    
         if (document.getElementById('ChkAll').checked) {
             for(i=0; i<document.getElementsByTagName('input').length;i++){
             document.getElementsByTagName('input')[i].checked = true;
             }
         }
         else {
             for(i=0; i<document.getElementsByTagName('input').length;i++){
              document.getElementsByTagName('input')[i].checked = false;
             }
         }
       }
    

    Try This

    【讨论】:

    • OP 没有用 jQuery 标记问题。来自 JavaScript 标记描述:“除非还包含框架/库的标记,否则需要纯 JavaScript 答案。”
    • document.getElementsByTagName('input') 将获得 all 复选框,而不仅仅是相应表格中的一个。此外,打电话给getElementsByTagName 效率很低。
    【解决方案6】:

    试试这个DEMO

    var checked=false;
    function checkedAll () {
    var aa =  document.getElementsByName("causelist_month");
    checked = document.getElementById('causelist_month').checked;
    
    for (var i =0; i < aa.length; i++) 
    {
        aa[i].checked = checked;
    }
    }
    
    function checkedAll2() {
    var aa =  document.getElementsByName("subscription_month");
    checked = document.getElementById('subscription_month').checked;
    
    
    for (var i =0; i < aa.length; i++) 
    {
        aa[i].checked = checked;
    }
    }
    

    【讨论】:

    • 我认为您应该删除if (checked == true){...} else {...} 声明。如果是true,则将checked 设置为true 似乎是不必要的。
    • @FelixKling, if() 条件已删除谢谢 :)
    猜你喜欢
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多