function checkAll(field) {
for (i = 0; i < field.length; i++) field[i].checked = true ;
}
This method was called by a link like this:
<a href="javascript:checkAll(document.form.checkboxes);">Check All</a>
All well and good, as long as the field that is passed into the function is an array of checkboxes. However, since javascript is a typeless language, you can call any method on an object, and depending on how egregarious the error is, the user might never see an error message. In this case, when the dynamically generated group of checkboxes has only one element, document.form.checkboxes
is not an array of checkboxes, and its length attribute doesn't return anything. The for loop is not executed at all, and the box is never checked.
The solution is simple enough, just check the type of object passed in:
function checkAll(field) {
if (field.type != 'checkbox') {
for (i = 0; i < field.length; i++) field[i].checked = true ;
} else {
field.checked = true;
}
}
It makes a bit of sense why one checkbox wouldn't be an array of size one, but the switch caught me a bit off guard. I'm trying to think of an analogous situation in the other dynamic languages I've used, but in most cases, you're either controlling both the calling and receiving code, or, in the case of libraries, the API is published. Perhaps the javascript API documenting this behavior is published--a quick google did not turn anything up for me.
Posted by moore at January 10, 2005 10:24 PM