简体   繁体   中英

JS syntax for checkbox name attribute with square brackets

This function limits the number of checkboxes selected by the user, but I'm having trouble getting it to work when the name attribute has square brackets (ie name=baz[] ).

For some reason I can't get this code to work in jsfiddle, but it's based on this tutorial , which has a working demo.

function chkcontrol(j) {
    var total = 0;
    for (var i = 0; i < document.form1.baz.length; i++) {
        if (document.form1.baz[i].checked) {
            total = total + 1;
        }
        if (total > 3) {
            alert("Please select up to three choices")
            document.form1.baz[j].checked = false;
            return false;
        }
    }
}

 <form name="form1">
    <input type=checkbox name="baz[]" value="1" onclick="chkcontrol(0);">Item 1
    <input type=checkbox name="baz[]" value="2" onclick="chkcontrol(1);">Item 2
    <input type=checkbox name="baz[]" value="3" onclick="chkcontrol(2);">Item 3
    <input type=checkbox name="baz[]" value="4" onclick="chkcontrol(3);">Item 4
    <input type=checkbox name="baz[]" value="5" onclick="chkcontrol(4);">Item 5

    <input type=submit value="submit">

</form>

Chaya, your issue is actually stemming from the fact that "[]" is part of the name.

While there are provisions to turn forms and their named elements into JS-accessible objects automatically, there are no provisions to understand which elements are intended to be arrays, versus non-arrays, as that's a server-side distinction: ?baz[]=1&baz[]=2 .

If you were to ask for form1["baz[]"]; you should get a list of all elements named "baz[]" .

From there, if you were to say form1["baz[]"][0]; you should get the first element named "baz[]".

You can, of course, write some parsing magic to automatically find all elements with "[]" in their names and append the "baz" as an array of the form, filled with all elements named "baz[]". And at that point you could do exactly what you were looking to do, before.

Whether or not that's overkill depends on what you're doing.

But simply writing form1["baz[]"][i] in your loop shouldn't be much more time-consuming than what you've currently got.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM