使用input+datalist简单实现实时匹配的可编辑下拉列表-并解决选定后浏览器默认只显示value的可读性问题

问题背景

最近小伙伴提了一个希望提高后台下拉列表可操作性的需求,原因是下拉列表选项过多,每次下拉选择比较费时费力且容易出错,硬着头皮啃了啃前端知识,网上搜寻了一些下拉列表实现的资料,这里总结一下。
PS: 以下所有代码实现效果截图均为chrome浏览器下效果,其他浏览器效果可能有一定差别,比如datalist在firefox和chrome下就有较明显差别,这不是本文重点这里不做讨论。

最简单的下拉列表实现

在HTML中传统显示下拉框的方法是使用select+option标签组合实现:

<select name="staff" id="id_list">
  <option value="10">&#x5F20;&#x4E09;</option>
  <option value="11">&#x674E;&#x56DB;</option>
  <option value="12">&#x738B;&#x4E94;</option>
  <option value="13">&#x9EC4;&#x516D;</option>
  <option value="14">&#x94B1;&#x4E03;</option>
</select>

显示效果如下:

使用input+datalist简单实现实时匹配的可编辑下拉列表-并解决选定后浏览器默认只显示value的可读性问题

当选项较少的时候,此种下拉列表自然够用了,然而当选项特别多(比如超过100个)的时候,用户要从其中选择特定项可能需要从头拉到尾,还需要肉眼match,不但工作量巨大,而且容易出错,于是自然出现了可编辑+自动匹配的下拉列表类型的需求。

最简单的可编辑下拉列表实现

H5标准中新提出了一个datalist标签,使用datalist+input可很简单地实现可编辑、智能匹配的下拉框:

<input list="id_datalist">
<datalist id="id_datalist" name="staff">
  <option value="10">&#x5F20;&#x4E09;</option>
  <option value="11">&#x674E;&#x56DB;</option>
  <option value="12">&#x738B;&#x4E94;</option>
  <option value="13">&#x9EC4;&#x516D;</option>
  <option value="14">&#x94B1;&#x4E03;</option>
</datalist>

选择显示效果如下:

使用input+datalist简单实现实时匹配的可编辑下拉列表-并解决选定后浏览器默认只显示value的可读性问题
使用input+datalist简单实现实时匹配的可编辑下拉列表-并解决选定后浏览器默认只显示value的可读性问题

此下拉框支持人工输入内容,并且会根据已输入部分自动更新可匹配选项列表,直接使用input+datalist标签实现,简单易懂无需额外js逻辑代码,单从使用上已可谓接近完美。
然而美中不足的是,选中option后,在输入框中默认显示的就是option.value 的值,而非其对应innerText,这对于value与innerText取值不一样的场景,极大地降低了选项的可读性,如下:选择王五之后,输入框只显示了12这个value,而没有显示王五这个innerText内容:

使用input+datalist简单实现实时匹配的可编辑下拉列表-并解决选定后浏览器默认只显示value的可读性问题

可编辑且默认显示option.innerText的下拉列表实现

为了解决上面提到的input默认显示option.value而非option.innerText的问题,找遍网上资料,目前发现暂时还是只能通过额外添加一些js代码逻辑来解决,其基本思想是使用两个input输入框,一个负责显示选项,另外一个负责实际的value存储(Show datalist labels but submit the actual value),用户网页实际只能看到负责显示的input,而存储实际value的input设置为type=”hidden”隐藏掉,只有提交表单时会默默地提交到后端。
参考stackoverflow中Stephan Muller和cobbystreet两位答主的答案,一个能区分不同value具有相同innerText内容选项的代码实现如下:

<script type="text/javascript">
    function checkSelectSet(e) {
        var input = e.target,
            list = input.getAttribute('list'),
            options = document.querySelectorAll('#' + list + ' option[value="'+input.value+'"]'),
            hiddenInput = document.getElementById(input.getAttribute('id').replace('-display', ''));

        if (options.length > 0) {
              hiddenInput.value = input.value;
              input.value = options[0].innerText;
          }
    }

    function addDataListListener(eid) {
        document.querySelector('#'+eid).addEventListener('input', checkSelectSet)
    }
</script>
<input type="text" name="staff-display" id="id_staff-display" list="list__staff" value="-" oninput="addDataListListener('id_staff-display')">
<datalist id="list__staff">
  <option value="10">&#x5F20;&#x4E09;</option>
  <option value="11">&#x674E;&#x56DB;</option>
  <option value="12">&#x738B;&#x4E94;</option>
  <option value="13">&#x9EC4;&#x516D;</option>
  <option value="14">&#x94B1;&#x4E03;</option>
  <option value="15">&#x94B1;&#x4E03;</option>
</datalist>
<input type="hidden" name="staff" value id="id_staff">

实现效果如下:

使用input+datalist简单实现实时匹配的可编辑下拉列表-并解决选定后浏览器默认只显示value的可读性问题
选定后效果:
使用input+datalist简单实现实时匹配的可编辑下拉列表-并解决选定后浏览器默认只显示value的可读性问题

转载请注明出处,原文地址:https://www.cnblogs.com/AcAc-t/p/readable_editable_dropdown_list_by_input_datalist.html

参考:

Show datalist labels but submit the actual value: https://stackoverflow.com/questions/29882361/show-datalist-labels-but-submit-the-actual-value

Original: https://www.cnblogs.com/AcAc-t/p/readable_editable_dropdown_list_by_input_datalist.html
Author: 及时
Title: 使用input+datalist简单实现实时匹配的可编辑下拉列表-并解决选定后浏览器默认只显示value的可读性问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578233/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Redis主从复制的配置和实现原理

    Redis的持久化功能在一定程度上保证了数据的安全性,即便是服务器宕机的情况下,也可以保证数据的丢失非常少。通常,为了避免服务的单点故障,会把数据复制到多个副本放在不同的服务器上,…

    Linux 2023年5月28日
    078
  • 站长工具

    背景 日常测试全国各种某网站的响应情况使用 站长工具 站长工具 http://tools.wujingquan.com/ 站长工具 ping检测 ping检测 https://pi…

    Linux 2023年6月6日
    0106
  • 【4】2022年6月

    6月15日 今早10点教师资格面试成绩出来了,幸好一次性通过。笔面都一次性通过,比我预想的顺利,谢谢各位考官的照顾。 我知道自己面试的时候既感冒又受伤,状态是不好的,发挥不了真实的…

    Linux 2023年6月13日
    074
  • 一篇文章学会shell脚本

    一、Shell传递参数 运行: 二、Shell数组 运行: 三、Shell运算符 1、算术运算符 注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的…

    Linux 2023年5月28日
    086
  • Linux基础03

    一些常见目录 usr目录 /usr/local/ # ⽤于保存⽤户安装软件程序信息 相当于windos中D:\Program Files (x86) linux系统安装软件的四种方…

    Linux 2023年6月7日
    084
  • 使用Supervisor监控mysql

    监控文件配置: [program:mysql] ; 管理的子程序名字,要和项目有关联,不能乱写command=/usr/local/mysql/bin/mysqld_safe &#…

    Linux 2023年6月6日
    047
  • K8S部署之VMWare网络拓扑踩坑

    知乎上最近发现一篇好文 图解K8S(01):基于Ubuntu 20.04部署1.23版K8S集群,想着之前 K8S 部署一直不成功,那么就照着这篇文章中说的试一试。结果在实验时遇到…

    Linux 2023年5月27日
    088
  • 剑指offer计划25(模拟中等)—java

    1.1、题目1 剑指 Offer 29. 顺时针打印矩阵 1.2、解法 常规开头,先判断特殊情况,然后创建四个变量存放矩阵四边的长度限制。创建res数组存放结果。循坏开始,遍历完一…

    Linux 2023年6月11日
    091
  • SSH升级版本–8.2p1

    前期准备 执行yum update openssh先升级下. 反正官方提供的这种升级是没问题的。如果之前手动编译操作过openssh的升级,变更了默认配置文件路径什么的请自行测试。…

    Linux 2023年6月8日
    084
  • SQLI-LABS(Less-1)

    Less-1(GET-Error-Single quotes-String) 打开Less-1页面,可以看到页面中间有一句 Please input the ID as param…

    Linux 2023年6月6日
    079
  • 删除数据库表中重复数据的方法

    一直使用Postgresql数据库,有一张表是这样的: DROP TABLE IF EXISTS "public"."devicedata"…

    Linux 2023年6月6日
    090
  • 重新认识运维

    重新认识运维 背景 随着业务的发展,新技术的迭代,公司研发采用了微服务架构或是上云等等,这没有考虑运维成本和效率,带来运维极大的复杂性,让运维纯手工,苦不堪言,痛苦。从现象来看,运…

    Linux 2023年6月8日
    098
  • C++ 之处理模板化基类的成员名称

    问题描述 假设有下面这么一段简单的代码,其中定义了两个类模板,一个基类 Animal,一个派生类 Dog: #include #include using namespace st…

    Linux 2023年6月7日
    096
  • Redis 经验谈

    新浪作为全世界最大的Redis用户,在开发和运维方面有非常多的经验。本文作者来自新浪,希望能为业界提供一些亲身经历,让大家少走弯路。 使用初衷 从2010年上半年起,我们就开始尝试…

    Linux 2023年5月28日
    091
  • 我的2021年总结

    前言 这一年把整个重心都放到考研上,对工作并没有那么上心,但也做个年终总结吧。相应的立一个flag,明年来看看工作上的flag完成了没有?2022年在技术上要成长啊。 22岁很迷茫…

    Linux 2023年6月8日
    0101
  • 开发环境的搭建

    ​ 一:ubuntu14.04 LTS开发环境搭建 1.1、参考博客 参考的教程如下: ubuntu老版本下载地址 VMware下Ubuntu Server 14.04安装教程(最…

    Linux 2023年6月13日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球