0

我有一段 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;
    }
}

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

不起作用的HTML...

<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>
4

3 回答 3

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;
}
于 2013-05-06T20:17:06.240 回答
2

这是因为这就是它的实施方式。

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

请参阅文档参考

演示

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;
    }
}
于 2013-05-06T20:18:32.120 回答
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;
    }
};
于 2013-05-06T20:18:36.283 回答