原生js实现下拉框多选功能

运行结果

在这里插入图片描述

基本思路

1、创建一个隐藏的option,添加到select的最后;
2、每次选中的值都存入这个option,如果已经选中,当再次选择时,就会删掉;
3、若已选择了值,就将隐藏的option的selected属性设置为true,以便获取多选内容

完整代码展示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>原生js实现多选功能</title>
</head>
<body>
    <div>
        <label>多选功能:</label>
        <select id="multipleSelect">
            <option selected="selected" disabled="disabled"  style='display: none' value=''></option>
            <option>HTML</option>
            <option>CSS</option>
            <option>Javascript</option>
            <option>vue</option>
            <option>react</option>
        </select>
    </div>
    <script>
        /*基本思路:
        1、创建一个隐藏的option,添加到select的最后;
        2、每次选中的值都存入这个option,如果已经选中,当再次选择时,就会删掉;
        3、若已选择了值,就将隐藏的option的selected属性设置为true,以便获取多选内容
        */
        let values = []; //存储选择的内容
        let opts = []; //存储option标签
        let select = document.getElementById("multipleSelect");
        for(let i=0;i<select.length;i++){
            opts.push(select.item(i));
        }
        //创建一个隐藏起来的option
        let optionHide = document.createElement('option');
        optionHide.hidden=true;
        select.appendChild(optionHide);

        select.addEventListener('input',function (){
            let value = this.options[this.selectedIndex].value; //获取当前选择的值
            this.options[this.selectedIndex].style="background: pink"; //选中的option背景为粉色
            let index = values.indexOf(value); //判断是否被选择,返回-1说明没选择,否则已被选择
            if(index>-1){ //若已选择,就删除该选择,并且将option的背景恢复为未被选择的状态
                values.splice(index,1);
                opts.filter(function (opt){
                    if(opt.value === value){
                        opt.style="";
                    }
                });
            }else {//没选择就将该值push到values中
                values.push(value);
            };
            this.options[this.length-1].text=values.toString(); //将values数组中的数据转化成字符串的格式赋给隐藏的option

            if(values.length>0){ //将隐藏的option的selected属性设置为true,这样select.value获取的值就是多选选中的值
                this.options[this.length-1].selected=true;
            }else {
                this.options[0].selected=true;
            }
            console.log(select.value);// 打印多选的内容
        });
    </script>
</body>
</html>

参考地址:
https://blog.csdn.net/bokestudy/article/details/90177144?utm_medium=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaidudefault-5.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaidudefault-5.control

  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值