原生js实现对select下拉列表的内容过滤

原生js实现对select下拉列表的内容过滤

  • 场景描述:
    笔者在工作的过程中,经常碰到这样的业务场景。客户要求一个下拉列表框旁边要有一个输入过滤的功能:如下图所示

这里写图片描述
由于在一个项目中出现了好多这样的需求,笔者就写了个采用原生js实现的对下拉的过滤功能。


  • 下面为代码:

    这里需要说明的是,输入过滤后对触发change事件需要根据个人的需求来定制。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>下拉框内容过滤的js实现</title>
        <style type="text/css">
            .select-filter {
                margin: 4px 4px;
                border:1px dashed #CCCCCC;
                background-color: #F0F0F0;
                font-size: 14px;
            }
            .input_init {
                color: gray;
                font-style: italic;
            }
        </style>
    </head>
    <body>
        <div>

            <!-- 下拉列表 -->
            请选择城市:<select name="city"  style="width: 80px;" onchange="selectOnchange()" >
                <option value="1">北京</option>
                <option value="1">上海</option>
                <option value="1">广州</option>
                <option value="1">深圳</option>
                <option value="1">杭州</option>
                <option value="1">南京</option>
                <option value="1">武汉</option>
                <option value="1">成都</option>
                <option value="1">长沙</option>
                <option value="1">南昌</option>
            </select>
            <!-- 过滤 -->
                <input  type="text" value="输入过滤" id ="filter" 
                    class="select-filter input_init" 
                    style="width: 80px ;" 
                    onclick="selectOnclick(this)" 
                    onblur="selectOnblur(this)" 
                    onmouseout="targetChangeFunction(this)" 
                    onkeyup="selectOnkeyup(this)" />
        </div>
        <script type="text/javascript">

            function selectOnchange(){
                // alert("下拉内容改变了")
                // targetChangeFunction(obj)
            }

            <!-- 过滤下拉 -->
            /** 输入过滤的4个事件 */
            function selectOnclick(obj){
                if(obj.value == "输入过滤") {
                    obj.value="";
                }   
            }

            function selectOnblur(obj){
                if (obj.value.trim() == "") {
                    obj.value="输入过滤";
                }
            }

            function selectOnkeyup(obj){
                // 获取过滤框的父级标签的第一个select子标签
                var select = obj.parentNode.getElementsByTagName("select")[0];
                // 获取过滤框的值,并全部转换成大写
                var filterValue = obj.value.trim().toUpperCase();
                // 将过滤框的值转换成小写
                var filterValueToLowerCase = obj.value.trim().toLowerCase();

                // for循环上面获取的select标签的option
                for (var i=0; i < select.options.length; i++) {
                    // 如果过滤框的值得大写形式和小写形式都不被option的值包含的话;把这个option隐藏
                    if (select.options[i].text.indexOf(filterValue) < 0 && select.options[i].text.indexOf(filterValueToLowerCase) < 0) {
                        select.options[i].style.display = "none";
                    } else{
                        // 否则把option 显示
                        select.options[i].style.display = "block";
                    }               
                }

                // for循环上面处理过后的option
                for (var i=0; i < select.options.length; i++) {
                    if (select.options[i].style.display == "block") {
                        // 选中所有option的样式是显示的第一个option
                        select.options[i].selected="selected";
                        // 跳出循环
                        break;
                    } else {
                        // 这里要解决火狐浏览器的bug。防止当当输入过滤都不符合的时候,火狐的下拉框为空
                        if(i == select.options.length-1){
                            // 这里当不满足过滤条件时,让他默认选择所有下拉的第一个
                            select.options[0].style.display = "block";
                            select.options[0].selected="selected";
                        }
                    }
                }
                return;     // 结束
            }

            /* 作用:主动触发change事件,这个事件根据业务场景来使用  */
            function targetChangeFunction(obj){

                /* 这里用js来主动触发change事件  */
                // 获取过滤框的父级标签的第一个select子标签
                var select = obj.parentNode.getElementsByTagName("select")[0];
                // 创建事件对象
                var eventObj = document.createEvent('HTMLEvents');
                // 初始化事件
                eventObj.initEvent("change",true,true) ;
                // 触发事件
                select.dispatchEvent(eventObj);
            }
        </script>
    </body>
</html>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值