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

2023-11-06

原生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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 【计算机视觉】详解 自注意力:Non-local 模块与 Self-attention (视觉注意力机制 (一))

    目录 绪论 一 视觉应用中的 self attention 机制 1 1 self attention 机制 1 2 Self attention 机制应用 Non local Neural Networks 绪论 在计算机视觉中 注意力机
  • Vue笔记_03组件_transition组件(Vue内置组件)

    目录 transition组件 作用 过渡时机 语法1 语法2 使用 animation侦动画 使用 过渡动画 总结 逻辑 前后端配置 动态显示页面 transition组件 作用 transition组件的作用是 给 单个 元素 组件 添
  • Uncaught SyntaxError: Invalid or unexpected token

    报错原因 内含中文字符串或者中文的符号 解决方案 1 去除页面上中文符号 改成英文符号 2 特殊的情况 那我的报错原因来说一下 报错代码和背景 我在做js使用DOM元素做拼接 报了这个错误 Uncaught SyntaxError Inva
  • 使用循环打印三角型以及九九乘法表

    一 循环打印三角形 1 需求分析 需要用到双层for循环来实现 外层循环实现行数 内层循环实现每行的个数 外层每循环一次 就换一次行 内层循环打印的个数与外层循环的行数是相对应的 由于内层循环的个数和外层循环的行数一样 所以内部循环的判断条
  • Linux下C++开发笔记--解决报错error: redefinition of “xxx“

    1 报错截图 2 错误原因 对应的头文件被多次包含 3 解决方法 在头文件最上面加上以下代码 以避免被多次包含 pragma once
  • 原码,反码,补码的使用

    机器码 1 首先得知道 什么是机器码 将符号 数字化 的二进制数就叫做机器码 其中有两点 1 将符号数字化 也就是将 用数字0表示 用数字1表示 最高位表示符号位 2 必须是二进制数 因为计算机中所有的数据都是以二进制形式存储的 2 了解了
  • HBase主要运行机制(物理存储和逻辑架构)

    本节将对 HBase 的主要运行机制进行简单介绍 HBase 的物理存储 HBase 表中的所有行都是按照行键的字典序排列的 因为一张表中包含的行的数量非常多 有时候会高达几亿行 所以需要分布存储到多台服务器上 因此 当一张表的行太多的时候
  • 【MySQL高级篇笔记-数据库备份与恢复(下) 】

    此笔记为尚硅谷MySQL高级篇部分内容 目录 一 物理备份与逻辑备份 二 mysqldump实现逻辑备份 1 备份一个数据库 2 备份全部数据库 3 备份部分数据库 4 备份部分表 5 备份单表的部分数据 6 排除某些表的备份 7 只备份结
  • 【VSCode】Windows系统的WSL无法启动vscode问题

    在WSL环境中无法启动vscode时 有可能是 WSL 插件的影响 可以使用下面的步骤来解决 Open VS Code on Windows Open Extensions and then search on WSL It should
  • Qt使用Qt Designer进行界面设计

    上一章我们使用代码直接进行界面设计 这一章我们使用Qt Designer进行界面设计 简单直接 所见即所得 大大提高了工作效率 特别是对于复杂界面 1熟悉Qt Designer Qt Designer是Qt专为界面设计做的软件 使得用户能够
  • 使用Python和OpenCV进行图像拼接和全景图构建

    使用Python和OpenCV进行图像拼接和全景图构建 1 效果图 2 原理及步骤 3 源码 3 1 拼接类源码 3 2 拼接用到的工具类 3 3 叠加多张图像源码 参考 这篇博客将介绍如何使用OpenCV执行图像拼接和全景构建 即给定两个
  • Hana Studio开发简介

    Hana Studio作为SAP官方的IDE 工具 推出也有一段时间了 就目前使用的情况来看 如果是做常规S 4开发 SAP GUI还是首要选择 一 IDE安装路径 链接 https pan baidu com s 1qMg8duocTa3
  • pyqt5实现按钮单窗口多页面切换

    1 使用QT Designer进行设计 创建一个MainWindow 从左侧选出Push Button Stacked Widget分别拖到我们的MainWindow里 怕看不见Stacked Widget 给他上个色 在QT Design
  • vant-weapp Area 省市区选择的使用及遇到的坑

    json中 导入 van area vant weapp area index 基础用法
  • SpringCloud gateway (史上最全)

    1 1 SpringCloud Gateway 简介 SpringCloud Gateway 是 Spring Cloud 的一个全新项目 该项目是基于 Spring 5 0 Spring Boot 2 0 和 Project Reacto
  • Kubernetes踩坑(二): Service IP(LVS)间断性TCP连接故障排查

    问题阶段 一 用户反应某个redis使用卡顿 连接该redis服务使用的是svc代理 即ipvs snat的方式 ipvsadm L发现 VIP收到的6379端口的数据包 会以rr的方式分别转发到pod的80 6379端口上 相当于会有50
  • mysql增加分区

    增加分区 是修改原有分区 从而替换现有分区 ALTERTABLE xxx表 PARTITION BY RANGE COLUMNS CREATE TIME PARTITION p20210901 VALUES LESS THAN 2021 1
  • 【华为OD机试c++】最长广播效应【2023 B卷

    题目描述 某通信网络中有N个网络结点 用1到N进行标识 网络中的结点互联互通 且结点之间的消息传递有时延 相连结点的时延均为一个时间单位 现给定网络结点的连接关系link i u v 其中u和v表示网络结点 当指定一个结点向其他结点进行广播
  • linux grep 带空格的内容,或者搜索多个单词,一段话

    错误示范 more xxx log grep UPDATE user info 正确方法 more xxx log grep UPDATE user info
  • 第23讲 Python range 数据类型

    您的 关注 和 点赞 是认可 是支持 是动力 如意见相佐 可留言 本人必将竭尽全力试图做到准确和全面 终其一生进行修改补充更新 本文首发在IT羊资源网 IT羊资源网 网址 https www ityangzy com IT羊资源网是IT世界

随机推荐

  • GB9706.1-2007+2020和IEC60601-1:2005 3.0+2012 3.1标准主要差异解析

    目录 GB9706 1 2007医用电气设备 第1部分 安全通用要求 GB9706 1 2020医用电气设备 第1部分 基本安全和基本性能的通用要求 IEC60601 1 第二版和第三版差异 1 最关键变化 2 新术语名词引用 3 设备分类
  • [1022]Hive insert 字段表错位

    文章目录 Hive insert 字段表错位踩坑 1 问题描述 2 排查过程 3 问题定位 4 解决方案 hive的insert语句列顺序问题以及新增字段遇到的坑 insert语句列顺序 对新增字段插入数据再查询发现是NULL Hive i
  • 技术管理主要做什么?

    最近一直在思考技术转管理过程中需要注意到的一些事情 现在就总结下分享给大家看看 核心职责 确定团队目标 不论项目大小 一定要有目标 有目标才能让所有人看到方向 明确每天工作的意义 单纯技术人员应该切换思维为全局性 而不局限于技术层面 现在个
  • 某盾滑块js逆向

    注 本篇博客仅供学习使用 请勿用做其他商业用途 如有侵权 请联系本菜鸟删除 本小菜鸟已经快两个月没更新文章了 一年总有那么356天不想努力 就想躺平 最开始学习js逆向的时候 用Python算法还原了某盾的空间推理 到现在已经过去半年多 这
  • Mybaties-plus 分页使用

    1 简介 查询分页分为物理分页和逻辑分页 1 逻辑分页 一次性查出所有数据 然后在内存中筛选需要的数据 缺点 大数据量时容易造成内存溢出 因为是一次性查出每次返回需要的所有数据时效性低不推荐使用 2 物理分页 通过sql 的limit 去控
  • 联想小新Pro14安装Ubuntu后无法进入系统、亮度无法调节、蓝牙无法打开、输入卡顿延迟等问题的解决办法

    联想小新Pro14安装Ubuntu后无法进入系统 亮度无法调节 蓝牙无法打开等问题的解决办法 前言 月初买了台联想小新Pro14 AMD锐龙5800H版本 在安装Ubuntu 20 04 2 LTS 系统时遇到了一些问题 所幸在众多网友前辈
  • Fetch&Fetch的二次封装

    前言 客户端服务器端通信方式ajax ajax JQ的类库 axios类库 jsonp fetch fetch是Es6新提供的API 基于不同于 XMLHttpRequest的方式 基于客户端和服务器端的数据通信 而且本身是基于promis
  • 数据预测分析

    数据预测分析 Matlab实现TCN时间卷积网络数据预测分析 目录 数据预测分析 Matlab实现TCN时间卷积网络数据预测分析 基本介绍 数据下载 程序设计 参考资料 致谢 基本介绍 此示例说明如何使用通用时间卷积网络 TCN 对序列数据
  • 南邮NOJ上机系统#PROB1005涂色问题

    涂色问题 描述 这是一个涂色问题 现在有一张网格 一共 3 行 每行 n 个 你需要用 3 种颜色给网格上色 需要确保相邻格子颜色不同 请问一共有多少种上色方案呢 答案对 109 7 取模 输入 一行一个整数 n 1 n 106 输出 一行
  • spring学习记录笔记-AOP 通知的五大注解详解

    印象云笔记记录 提供链接 点我打开笔记
  • python3中TypeError: data type not understood的解决方法X_b = np.hstack([np.ones((len(x), 1)), x.reshape(-1,

    学习6 4 实现线性回归中的梯度下降法时 在JupterNotebook中按照教程来完全没有问题 但是在pycharm中封装这个方法时 def fit gd self X train y train eta 0 01 n iters 1e4
  • 【动手学习深度学习v2】循环神经网络-2.文本预处理

    上一篇 动手学深度学习V2 循环神经网络 1 序列模型 文章目录 2 文本预处理 2 1 读取数据集 2 2 词元化 2 3 词表 2 4 整合 2 文本预处理 序列数据的多种形式中 文本数据是最常见的一种 在英文文本中一篇文章或者一段句子
  • C++中类似于Integer.MAX_VALUE的INT_MAX表示

    要想使用需要添加头文件 include
  • Maven下载依赖踩坑:Could not transfer artifact org.springframework.boot:spring-boot-starter-parent

    环境 IDEA 公司办公环境 本文只适用于启用了代理服务进行联网的情况 非此情况的朋友们还请另找原因 创建工程后spring boot starter parent等依赖标红 因为对应的依赖找不到 下载时报错误 Could not tran
  • Unity学习之性能分析

    Unity 提供的性能分析工具 Unity Profiler 测量 Unity 编辑器 您的应用程序在运行模式下 或在开发模式下连接到设备运行时的性能 Profiling Core 包 提供的 API 可用于将上下文信息添加到 Unity
  • Python获取各大企业招聘需求以及可视化分析展示

    前言 大家早好 午好 晚好吖 欢迎光临本文章 课程亮点 1 爬虫的基本流程 2 可视化分析展示 3 requests模块的使用 4 保存csv 开发环境 python 3 8 运行代码 pycharm 2022 3 2 辅助敲代码 专业版
  • antd table表格组件基本使用

    第一次使用antd的table表格组件 借用官方文档数据 展示下Demo import React from react import Table from antd const columns title Name dataIndex n
  • 全国计算机等级考试二级C语言考试学习笔记

    1 C语言程序的结构 1 1 程序的构成 main函数和其他函数 1 1 1 main函数 一个完整的C语言程序 是由一个 且只能有一个main 函数 又称主函数 必须有 和若干个其他函数结合而成 可选 main函数是C语言程序的入口 程序
  • 药监局网瑞数绕过与反爬学习

    药监局瑞数反爬学习 贴逆向好的js代码 剩下靠你们自己了 需要返回cookie 否则无限跳转 文件夹中带有nginx静态服务配置 使用nginx后 并在hosts中添加一行app1 nmpa gov cn 你nginx的ip 浏览器访问ht
  • 原生js实现对select下拉列表的内容过滤

    原生js实现对select下拉列表的内容过滤 场景描述 笔者在工作的过程中 经常碰到这样的业务场景 客户要求一个下拉列表框旁边要有一个输入过滤的功能 如下图所示 由于在一个项目中出现了好多这样的需求 笔者就写了个采用原生js实现的对下拉的过