当前位置:首页 > 文章 > 正文内容

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

廖万里3年前 (2022-10-27)文章18199

问题背景

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

最简单的下拉列表实现

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

<select name="staff" id="id_list">
  <option value="10">张三</option>
  <option value="11">李四</option>
  <option value="12">王五</option>
  <option value="13">黄六</option>
  <option value="14">钱七</option></select>

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

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

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

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

<input list="id_datalist"><datalist id="id_datalist" name="staff">
  <option value="10">张三</option>
  <option value="11">李四</option>
  <option value="12">王五</option>
  <option value="13">黄六</option>
  <option value="14">钱七</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">张三</option>
  <option value="11">李四</option>
  <option value="12">王五</option>
  <option value="13">黄六</option>
  <option value="14">钱七</option>
  <option value="15">钱七</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


本文链接:https://www.kkkliao.cn/?id=170 转载需授权!

分享到:

版权声明:本文由廖万里的博客发布,如需转载请注明出处。


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

工龄38年机关事业单位人员正处级养老金有多少钱?

工龄38年机关事业单位人员正处级养老金有多少钱?

机关事业单位人员,工龄38年,正处级,养老金有多少钱?机关事业单位人员,如果在2024年以前退休,那么是属于退休中人,相比退休老人,养老金计算方式比较特殊,如果退休时,当地还没有理顺养老金待遇,就会领取预发养老金,等以后理顺后,再进行补发。那么对于工龄38年,正处级,养老金可以达到多少呢?应该说,正...

人的寿命?科学家找到了答案,竟和走路速度有关?

人的寿命?科学家找到了答案,竟和走路速度有关?

关于走路每个人都有不同的说法,有些人觉得适度走路能走掉很多疾病,有些人觉得坚持走路会把膝盖走坏,有些人在走路中获得了益处,但有些人却走出了问题。还有人说走路和寿命之间存在联系,那么这种说法是否准确呢?不妨让我们一起来看看科学家的答案。人的寿命竟然跟走路速度有关?科学家找到答案,你走路够快吗?美国匹兹...

6G专利申请量比拼:美国占比35.2%,日本占比9.9%,中国排第几?

6G专利申请量比拼:美国占比35.2%,日本占比9.9%,中国排第几?

5G对于现在的人们来说已经不是什么神秘的存在,很多国家通过近些年的研究都已经逐步掌握了5G技术。不过就5G技术发展的成熟度、设备完善程度以及信号铺设范围来说,我国都是当之无愧的世界第一。但是随着科技技术的不断发展,对于6G的技术研发也被提上日程。不少国家都开始攻克6G技术,并取得了各项专利。根据有关...

骁龙8和骁龙8+的日常体验,到底有多大差距?

骁龙8和骁龙8+的日常体验,到底有多大差距?

机哥写过一篇文章。主要呢,就是盘点了今年那些跳水比较严重的旗舰手机。像什么OPPO Find X5 Pro天玑版啊、小米12 Pro啊、一加10 Pro啊等等。相比起刚上市时定价,现在这些机型,普遍的降价幅度都超过了2000块。原本是卖5000多,现在却只卖3000多。。机哥当时发完文章,底下很大一...

步步高创始人段永平,高手有所为有所不为,35条深度思考值得收藏

步步高创始人段永平,高手有所为有所不为,35条深度思考值得收藏

段永平,一个注定在商业史无法被忽视的存在。段永平的经历可谓传奇。他是国内第一个拍下来股神巴菲特午餐的男人,那时候他还带上了现在拼多多的创始人黄铮。而这个一手创办了小霸王、步步高等著名企业,并与Vivo、OPPO、一加和拼多多有着千丝万缕联系的企业家,这位通过投资网易、腾讯和苹果而获利颇丰的投资者,也...

最简单的生活一天花多少钱?

最简单的生活一天花多少钱?

90后负债女孩的极简主义:月薪6000+,一天的真实花销精简但你绝对想不到!广西农村姑娘在广州,网贷负债6w,人情债接近3w,到手月薪6000+,在珠江新城商业CBD上班,一天真实的花销在多少?道出多少负债人的辛酸!疫情这3年的收入,固定死工资基本就这个数了,负债之下一直没啥存款,都是还没发工资都被...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。