如何移动选择多个复选框,如 GMail?

IT技术 javascript gmail
2021-02-25 11:20:49

在 GMail 中,用户可以单击电子邮件列表中的一个复选框,按住 Shift 键,然后选择第二个复选框。然后 JavaScript 将选择/取消选择两个复选框之间的复选框。

我很好奇这是怎么做到的?这是 JQuery 还是一些基本(或复杂)的 JavaScript?

6个回答

我写了一个使用 jquery 的独立演示:

$(document).ready(function() {
    var $chkboxes = $('.chkbox');
    var lastChecked = null;

    $chkboxes.click(function(e) {
        if (!lastChecked) {
            lastChecked = this;
            return;
        }

        if (e.shiftKey) {
            var start = $chkboxes.index(this);
            var end = $chkboxes.index(lastChecked);

            $chkboxes.slice(Math.min(start,end), Math.max(start,end)+ 1).prop('checked', lastChecked.checked);
        }

        lastChecked = this;
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html>
<head>
</head>
<body>
    <input type="checkbox" id="id_chk1" class="chkbox" value="1" />Check 1<br/>
    <input type="checkbox" id="id_chk2" class="chkbox" value="2" />Check 2<br/>
    <input type="checkbox" id="id_chk3" class="chkbox" value="3" />Check 3<br/>
    <input type="checkbox" id="id_chk4" class="chkbox" value="4" />Check 4<br/>
    <input type="checkbox" id="id_chk5" class="chkbox" value="5" />Check 5<br/>
    <input type="checkbox" id="id_chk6" class="chkbox" value="6" />Check 6<br/>
    <input type="checkbox" id="id_chk7" class="chkbox" value="7" />Check 7<br/>
</body>
</html>

在没有按住 shift 单击的情况下取消选中某些框后,多次单击 shift 似乎不起作用。jsfiddle.net/5fG5b
2021-04-23 11:20:49
那是因为它应该是.prop('checked',而不是.attr('checked'jsFiddle:jsfiddle.net/dn4jv9a5
2021-04-26 11:20:49
@schnauss 谢谢,你说得对,我已经更新了答案。在我的辩护中,原始答案是在 prop() 可用之前写的
2021-05-03 11:20:49
您可以调用 slice 而不是使用 for 循环。它看起来像这样:“$('.chkbox').slice(min..., max... + 1).attr('checked', lastChecked.checked)”
2021-05-14 11:20:49
如果没有抽象的 jquery 插件,答案是蹩脚的。所以这里是gist.github.com/3784055
2021-05-17 11:20:49

这是通过相当简单的 javascript 完成的。

他们跟踪最后一个复选框的 id,当另一个复选框被选中时,他们使用shiftKey 事件属性来查看在单击复选框时是否保持了 shift。如果是这样,他们将两者之间的每个复选框选中属性设置为 true。

要确定何时选中一个框,他们可能会在复选框上使用onclick事件

如果您愿意,可以使用 Mozilla 开发人员网络中的参考:shiftKey 事件属性输入元素属性onclick
2021-05-11 11:20:49

最近,我编写了一个 jQuery 插件来提供该功能以及更多功能。

包含插件后,您只需要使用以下代码片段初始化复选框的上下文:

$('#table4').checkboxes({ range: true });

这是文档、演示和下载的链接:http : //rmariuzzo.github.io/checkboxes.js/

似乎我可以在网上找到的每个答案都完全依赖于 jQuery。JQuery 添加的功能很少。这是一个不需要任何框架的快速版本:

function allow_group_select_checkboxes(checkbox_wrapper_id){
    var lastChecked = null;
    var checkboxes = document.querySelectorAll('#'+checkbox_wrapper_id+' input[type="checkbox"]');

    //I'm attaching an index attribute because it's easy, but you could do this other ways...
    for (var i=0;i<checkboxes.length;i++){
        checkboxes[i].setAttribute('data-index',i);
    }

    for (var i=0;i<checkboxes.length;i++){
        checkboxes[i].addEventListener("click",function(e){

            if(lastChecked && e.shiftKey) {
                var i = parseInt(lastChecked.getAttribute('data-index'));
                var j = parseInt(this.getAttribute('data-index'));
                var check_or_uncheck = this.checked;

                var low = i; var high=j;
                if (i>j){
                    var low = j; var high=i; 
                }

                for(var c=0;c<checkboxes.length;c++){
                    if (low <= c && c <=high){
                        checkboxes[c].checked = check_or_uncheck;
                    }   
                }
            } 
            lastChecked = this;
        });
    }
}

然后在需要时初始化它:

allow_group_select_checkboxes('[id of a wrapper that contains the checkboxes]')
“jQuery 添加了很少的功能” <3 谢谢你。
2021-05-16 11:20:49

好吧,这篇文章已经很旧了,但这是我刚刚遇到的一个解决方案: jQuery Field Plug-In