javascript - 只有一个复选框时'checkAll'奇怪的行为

时间:2013-05-06 20:09:03

标签: javascript

我有一段JavaScript应该检查或联合检查我的所有复选框(命名相同)..当有多个复选框时,工作正常...没有'如果只有一个复选框,则工作。 (我意识到在单一选项屏幕上点击“全部检查”之间的实际区别是相同的,并且有人可能认为“检查全部”甚至不应出现在只有一个选项的屏幕 - 但是客户端坚持在一致的屏幕上......所以请不要把我带到我已经讨论过的路线上

脚本:

// check uncheck all check boxes
var checkAll = function( checkname, exby ) { 
    alert( checkname.length ); // undefined when there is only one check box
    for ( i = 0; i < checkname.length; i++ ) {
        checkname[i].checked = exby.checked ? true : false;
    }
}

注意 - 我添加了一个警告来检查长度,当只有一个复选框时它是未定义的,但在任何其他时间都是准确的????

DOESN的工作......

<form method="post" name="createInvoice" >
    Check/Uncheck All <input name="chkAll" onclick="checkAll( document.createInvoice.PO, this );" type="checkbox" >
    <input name="PO" value="7835" class="chkbox" type="checkbox" >
</form>

要做的HTML ......

<form method="post" name="createInvoice" >
    Check/Uncheck All <input name="chkAll" onclick="checkAll( document.createInvoice.PO, this );" type="checkbox" >
    <input name="PO" value="13506" class="chkbox" type="checkbox" >
    <input name="PO" value="14046" class="chkbox" type="checkbox" >
</form>

3 个答案:

答案 0 :(得分:3)

如果只有1那么它就是元素,而不是数组。

if (!!checkname.length) {
    for ( i = 0; i < checkname.length; i++ ) {
        checkname[i].checked = exby.checked ? true : false;
    }
} else {
    checkname.checked = exby.checked ? true : false;
}

答案 1 :(得分:2)

这是因为它是如何实现的。

  

名称可以在document.getElementsByName()方法中使用,表单和表单元素集合。与表单或元素集合一起使用时,它可能返回单个元素或集合。

See Document Ref

Demo

var checkAll = function( checkname, exby ) { 
  if(!checkname.length)
  {
      checkname.checked = exby.checked ? true : false;
      return;
  }
    alert( checkname.length ); // undefined when there is only one check box
    for ( i = 0; i < checkname.length; i++ ) {
        checkname[i].checked = exby.checked ? true : false;
    }
}

答案 2 :(得分:2)

我相信当你有一个名为“PO”的复选框时,document.createInvoice.PO将评估具有该名称的单个DOM元素。如果有多个,显然它会给你一个DOM元素列表,它具有length属性。

所以当只有一个时,你没有得到一个长度。

您可以添加逻辑来处理这两种情况:

var checkAll = function( checkbox, exby ) {
    var checkboxes = checkbox.length ? checkbox : [checkbox];
    for ( i = 0; i < checkboxes.length; i++ ) {
        checkboxes[i].checked = exby.checked;
    }
};