【问题标题】:jQuery - Logging order of checkbox clicksjQuery - 复选框点击的记录顺序
【发布时间】:2011-05-04 22:40:33
【问题描述】:

我有一个跟踪表演艺术中心志愿者的系统。当他们报名轮班工作时,他们也可以报名一个伙伴(或多个伙伴)。如果我们有太多的注册,还有一个等待名单。选择好友的表格如下所示:

如果等待名单只剩下一个位置,我需要将下一个人的名字变成红色(因此选择了约翰,但是当检查简时,她会变成红色以发出警告)。

我的问题是用户可能决定同时选中它们,然后取消选中 John 而不是 Jane,这应该会使 Jane 再次变黑。

有没有一种简单的方法可以使用类似的方法来跟踪点击:

$("input:checkbox").change(function(){

    $("input:checked").each(function(i){

       //object/array manipulation?

    });

});

我使用元素的索引让它工作正常,但意识到这不起作用,因为它会跟踪首先选中复选框的顺序。

即使是正确方向的一点也会令人惊叹。我意识到我没有付出太多。

谢谢,

杰森

【问题讨论】:

    标签: jquery arrays object checkbox


    【解决方案1】:

    不错的挑战。你可以这样做:

    var limit = 4;  //Maximum checked allowed, for example 4
    var checkedOrder = []; //Priority queue (stores checking order)
    $("input:checkbox").change(function(){
        var nCurrentlyChecked = $("input:checkbox:checked").length; // EDIT: How many are currently checked?
        if($(this).is(":checked")){ //If checkbox is checked
            checkedOrder.unshift(this); //Insert to the begining of the array (push to the queue)
            if(nCurrentlyChecked > limit) //If more than allowed
                $(this).next().css('backgroundColor', 'red'); //Turn element red
        }else{ //If checkbox is unchecked
            $(this).next().css('backgroundColor', 'black'); //Always blacken unchecked checkbox
            var nTurnedBlack = 0;
            //Now, we blacken checkboxes by priority
            for(var i=0; i<checkedOrder.length && nTurnedBlack <= limit; i++){           
               var checkbox = checkedOrder[i];
               if(checkbox == this) continue; //Ignore currently unchecked checkbox
               $(checkbox).next().css('backgroundColor', 'black'); 
               nTurnedBlack++;
            }
        }
    });
    

    如您所见,它有一个“偏好”,可以将首先选中的复选框变黑。这不是经过测试的代码,可能有错误,但我希望它能指导您找到最终解决方案

    【讨论】:

    • 你完全按照我的要求做了。我不能感谢你。我已经提交了一个小修改请求,即在 $.change 事件的开头添加 nCurrentlyChecked = $("input:checked").length; 以查看检查了多少输入。
    • 不客气。是的,我忘记了那条线嘿嘿。你的版本是对的。我很高兴它对你有所帮助。干杯
    • 我现在在生产中发现了一个问题:当您取消选中一个元素时,它会将所有元素变为黑色,而不仅仅是应该为黑色的元素。想法?
    【解决方案2】:

    您可以轻松计算选中复选框的数量:

    $("input:checkbox").change(function(){
        if ($("input:checkbox:checked").length >= maxSlotsAvailable) {
            // Make your remaining ones red, be sure that no newly-checked
            // ones are red
            $("input:checkbox:not(:checked)").addClass("maxedOutWarning");
            $("input:checkbox:checked").removeClass("maxedOutWarning");
        }
        else {
            // Make sure they're all black
            $("input:checkbox").removeClass("maxedOutWarning");
        }
    });
    

    ...其中maxSlotsAvailable 是可用插槽的数量。以上适用于页面上的 all 复选框,但您可以通过选择器轻松地将其范围限定为特定容器。

    上面的想法是,即使所有插槽都已填满,用户也可以继续检查复选框;如果您要阻止这种情况,那么您可以删除if 的 true 子句的第二行。 (我可能会让他们能够随意选中和取消选中复选框,只需一个单独的指示器显示他们选中了太多,并进行预提交测试以确保没有太多。我认为从听起来这也是你正在做的事情。)

    【讨论】:

    • 感谢您的深思熟虑的回应。我几乎说得够清楚了!我确实希望他们随意检查和取消检查,但是我想保留检查它们的顺序。因此,例如,如果我们有 2 个可用点并且选中了复选框 1、2、3 和 4,则 3 和 4 将是红色的。现在,如果用户取消选中#1,那么#3 应该是第一个“非红色”的。如果以相反的顺序检查它们,则会发生相同的情况,但相反。
    • 这背后的真实想法是,如果他们注意到某些人会被添加到候补名单中,他们可能会改变他们对候补名单的看法,这就是为什么顺序很重要。当我提交表单时,我需要附上不是难点的订单。
    • @jeerose 我很幸运在编写解决方案时猜到了这个要求。我已经发了,你看看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多