有一个列表搜索<select>可以隐藏所有与搜索中输入的内容不匹配的项目。但是有一个问题,当在一个大列表(4500 个元素)中搜索时,它会挂起几秒钟。您还可以搜索或优化哪些其他方式?
document.addEventListener("click", function(e) {
let input = document.getElementById(dataTargetID + 'Input');
let val = input.value.trim().toUpperCase();
let searchItems = document.querySelectorAll('#'+dataTargetID + ' option');
if (e.target.classList.contains('keyboard__key')) {
if (val != '') {
searchItems.forEach(function (elem){
if (elem.innerText.toUpperCase().search(val) == -1) {
elem.classList.add('hidden')
}
else {
elem.classList.remove('hidden');
}
});
}
else {
searchItems.forEach(function (elem){
elem.classList.remove('hidden');
});
}
}
})
我认为它会更快,因为:
input无需每次搜索searchItemsincludes快于searchfor of快于forEachif else我想出了一个没有类的变体,但是通过
fragment-s。根据我的检查和在线测试,这在 FF 和 Chrome 中运行得更快。如果我理解正确,它会更快,因为:
option-ov 直接在select一站式解决方案,用于多个
input“查询”输入和select搜索。JS:
Potestiv 注意到它
.forEach的工作速度更快,因此使用它。.includes()在文本中找到任何匹配项,可以将其替换为另一个,但会减慢搜索速度。对我而言,主要优点是当
focuseinputa 保存 a 的内容select(基本上是 alloption)时,它会在迭代之后。HTML:
with 的绑定
input与andselect类似,JS 会查找.labelinputselectinput[data-for]代码如何在 4500 选项上工作的示例
Ps 如何比较和什么。我拿了一个 4500 的数组
option,它在上面的链接上,并通过了一些方法:.map()- ~28ms.forEach()- ~6msfor()- ~26mswhile() i++- ~21mswhile(len--)- ~19ms迭代动作是用 even 隐藏元素
value。测试代码
我试图用 做一个变体
.filter(),但它并没有变得更好,相反,执行时间增加了。我的代码使用值匹配,它
.innerText从 4500option秒返回value并且innerText等于序数,与值匹配 -1需要约 131 毫秒。建议同事将搜索替换为
.innerText,我尝试了一些选项,结果如下:.innerText- ~131ms.value- ~20ms - ~.innerHTML26ms.textContent- ~25ms.dataset- ~23ms对于后四个,差异不是特别明显,但建议使用
.value.