Javascript 如何根据输入值可靠地计算数据列表中的匹配数?
我有一个填充的Javascript 如何根据输入值可靠地计算数据列表中的匹配数?,javascript,html,autocomplete,Javascript,Html,Autocomplete,我有一个填充的datalist元素与input元素关联,以在现代浏览器上启用本机自动完成功能: HTML代码 <input type="search" id="search" list="autocomplete" /> <datalist id="autocomplete"> <option value="c++" /> <option value="javascript" /> <option value="ht
datalist
元素与input
元素关联,以在现代浏览器上启用本机自动完成功能:
HTML代码
<input type="search" id="search" list="autocomplete" />
<datalist id="autocomplete">
<option value="c++" />
<option value="javascript" />
<option value="html" />
<option value="php" />
</datalist>
我知道你们中的大多数人可能会使用jQuery或其他库来完成这项任务,但我宁愿坚持使用新发现的本机方法。看来您当前的解决方案给出了一些错误的结果。如果键入字母
a
,循环将显示5个结果,但将显示0个选项indexOf()
正在计算javascript、java、visual basic、chapel和charm
因此,不要使用indexOf()
,而是将其更改为使用charAt(0)
。使用,我们将比较搜索输入的第一个字母与可能选项的第一个字母
if (options[i].value.charAt(0) === this.value.charAt(0))
这为您提供了将显示的选项数量的准确可靠计数
这是您的最新信息
我在Chrome&IE上测试过,你也得到了同样的结果
更新-发现错误
Search Results Options
a 0
h 1 html
j 2 javascript, java
javascript 2 javascript
所以我们可以看到最后的结果是不正确的。因此,我们希望使用您的原始解决方案&我的。这将阻止上表中的最终场景
if (options[i].value.charAt(0) === this.value.charAt(0) && options[i].value.indexOf(this.value) !== -1)
我知道这是一篇老文章,但我对这两种解决方案都有疑问。上述两种解决方案要么只在部分时间内返回正确的数字,要么在选项缩小时继续返回0。对我有效的解决方案实际上是,在缩小搜索结果范围时,查看其中是否有任何选项包含搜索条件
for(var i = 0; i < options.length; i++) {
if (options[i].value.toLowerCase().includes(search.value.toLowerCase()))
n_matches++;
}
for(变量i=0;i
您建议的方法似乎计算了正确的匹配数。但是,在字段中输入某个内容,然后将其删除后,计数器将显示0
,下拉列表中仍显示chrome中最后一个非空匹配的结果,并在IE中显示列表中的所有内容。删除该内容,您是否真的碰到了退格?或者使用x
清除问题?如果我删除了某些内容,则下拉列表根本不会显示。如果我点击x
,下拉列表将保持不变。但我认为这是数据列表
更期望的行为。至于IE,它似乎就是IE选择实现它的方式。如果我们删除JavaScript,只使用HTMLdatalist
,事情仍然是这样。因此,这不是受我的解决方案或你的解决方案影响的问题。如果你想更改这些浏览器功能,我认为你必须创建一个新问题。无论如何,在有条件执行语句之前应用最小字符数检查似乎能准确地、更重要的是可靠地解决问题。基于开始的子字符串匹配是一个很好的选择,我感谢您的努力。欢迎来到SO。除了分享你的代码,你还应该考虑进一步说明为什么你的解决方案比现有的(和被接受的)一个更好,以及你面对的问题。这可能有助于将来遇到与您相同问题的其他用户。
for(var i = 0; i < options.length; i++) {
if (options[i].value.toLowerCase().includes(search.value.toLowerCase()))
n_matches++;
}