2013-05-06 84 views
0

我有一块JavaScript应该检查或联合国检查所有我的复选框(命名相同)..工作正常时,有超过如果只有一个复选框存在,则一个复选框不起作用。 (我意识到在单个选项屏幕上单击'全部选中'之间的实际区别是相同的,有人可能会争辩说'全部选中'应该甚至不会出现在屏幕上,只有一个选项 - 但客户端坚持一致屏幕...所以请不要把我失望,我已经指出的路线)javascript - 'checkAll'怪异的行为,当只有一个复选框

脚本:

// 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> 
+0

无耻的自我推广(如果您已经使用,或不介意介绍,jQuery的):http://mjball.github.io/ jQuery-CheckAll/ – 2013-05-06 20:11:28

+0

你的复选框不应该有不同的名字吗? – j08691 2013-05-06 20:11:58

+1

@ j08691尽管**通常是一个不错的主意,可以将名称分开,但他的复选框可用作多选,因此名称相同也是有意义的。尽管如此,你仍然不能有重复的ID。 – 2013-05-06 20:19:15

回答

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; 
} 
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; 
    } 
} 
+1

+1参考链接。我觉得人们正在跳过这些参考文献,并在文档通常更准确时使用SO。 – 2013-05-06 20:21:30

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; 
    } 
}; 
+0

这是一个非常有用的代码!谢谢 – 2015-07-08 12:49:55