0

我有一个CheckBoxList,我的要求是允许用户选择最多三个选项(通过 Javascript),一旦他点击第四个选项,第一个被选中的选项CheckBox就会被取消选中,同样当他选择第五个(另一个)选项时,CheckBox它被选中第二,不受检查等等。最终用户只剩下三个选定的选项。

例如。在给定的图像中,如果用户选择 .Net(第一个)、Java(第二个)、PHP(第三个),当他选择 SQL(第四个)时,.Net 未选中而 SQL 被选中。此外,当他选择云计算(第五)时,Java 未被选中。

在此处输入图像描述

我已经编写了以下 Javascript,它适用于第一个场景,并在选择第四个时取消选中第一个选中的项目,但它不能进一步工作,因为counter值再次达到 4 并cbArray[counter - 4]再次尝试取消选中第一个框而不是第二个. 如何解决这个问题。谢谢。

我的Javascript:

<script type="text/javascript" language="javascript">
        function limitChecked(maxCount) {
            debugger;
            var ocbList = document.getElementById('cbList');
            var cbArray = ocbList.getElementsByTagName('input');
            var counter = 0;
            for (var i = 0; i < cbArray.length; i++) {
                if (cbArray[i].checked==true) {
                    counter++;
                    if (counter > maxCount) {
                           cbArray[counter - 4].checked = false;
                    }
                }
            }
        }
</script>

.aspx 代码:

<body>
    <form id="form1" runat="server">
    <div>
        Courses:
        <asp:CheckBoxList ID="cbList" runat="server" onclick="limitChecked(3)">
            <asp:ListItem>.Net</asp:ListItem>
            <asp:ListItem>Java</asp:ListItem>
            <asp:ListItem>PHP</asp:ListItem>
            <asp:ListItem>SQL</asp:ListItem>
            <asp:ListItem>Cloud Computing</asp:ListItem>
        </asp:CheckBoxList>
    </div>
    </form>
</body>
4

2 回答 2

2

根据 Trendy 的建议(McGarnagle 的回答也有帮助),我想出了这个解决方案,对我来说效果很好。

function limitChecked(maxCount) {
            debugger;
            var ocbList = document.getElementById('cbList');
            var cbArray = ocbList.getElementsByTagName('input');
            var checkedArray = [];
            for (var i = 0; i < cbArray.length; i++) {
                if (cbArray[i].checked == true) {
                    checkedArray.push(i);
                    if (checkedArray.length > maxCount) {
                        checkedArray = checkedArray.slice(0);
                        cbArray[checkedArray[0]].checked = false;
                    }
                }
            }
        }
于 2013-07-27T00:59:09.147 回答
1

您可以使用 push/pop 代替计数器。Usingslice(0)允许您使用像 FIFO 队列这样的数组:

function limitChecked(maxCount) {
        debugger;
        var ocbList = document.getElementById('cbList');
        var cbArray = ocbList.getElementsByTagName('input');
        var checked = [];
        for (var i = 0; i < cbArray.length; i++) {
            if (cbArray[i].checked==true) {
                checked.push(i);
                if (checked.length > maxCount) {
                    cbArray[checked[0]].checked = false;
                    checked = checked.slice(1);
                }
            }
        }
    }
于 2013-07-26T23:14:03.647 回答