请求改进按大陆名称前缀匹配的搜索列表JavaScript代码
解决方案:实现大陆名称前缀匹配搜索
我看了你的代码,问题主要出在两个地方:一是显示/隐藏列表的逻辑有误(每次按键会切换显示状态,导致输入过程中列表反复消失),二是使用了包含匹配的indexOf而不是前缀匹配。下面是修改后的完整代码,完全满足你的需求:
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> * { box-sizing: border-box; } #myInput { background-image: url('/css/searchicon.png'); background-position: 10px 12px; background-repeat: no-repeat; width: 100%; font-size: 16px; padding: 12px 20px 12px 40px; border: 1px solid #ddd; margin-bottom: 12px; } #myUL { list-style-type: none; padding: 0; margin: 0; display: none; } #myUL li a { border: 1px solid #ddd; margin-top: -1px; /* 避免双重边框 */ background-color: #f6f6f6; padding: 12px; text-decoration: none; font-size: 18px; color: black; display: block; } #myUL li a:hover:not(.header) { background-color: #eee; } </style> </head> <body> <h2>世界各大陆人口统计</h2> <input type="text" id="myInput" onkeyup="myFunction()" placeholder="搜索大陆名称..." title="输入大陆名称"> <ul id="myUL"> <li><a href="#">亚洲 - 4,641,054,775</a></li> <li><a href="#">非洲 - 1,340,598,147</a></li> <li><a href="#">欧洲 - 747,636,026</a></li> <li><a href="#">北美洲 - 592,072,212</a></li> <li><a href="#">南美洲 - 430,759,766</a></li> <li><a href="#">大洋洲 - 43,111,704</a></li> <li><a href="#">南极洲 - 0</a></li> </ul> <script> function myFunction() { var x, input, filter, ul, li, a, i, txtValue; input = document.getElementById("myInput"); filter = input.value.toUpperCase(); ul = document.getElementById("myUL"); x = ul; // 修改1:根据输入内容控制列表显示/隐藏,输入为空时隐藏,有内容时显示 if (filter.length > 0) { x.style.display = "block"; } else { x.style.display = "none"; } li = ul.getElementsByTagName("li"); for (i = 0; i < li.length; i++) { a = li[i].getElementsByTagName("a")[0]; txtValue = a.textContent || a.innerText; // 修改2:用startsWith实现前缀匹配,替代原有的包含匹配indexOf if (txtValue.toUpperCase().startsWith(filter)) { li[i].style.display = ""; } else { li[i].style.display = "none"; } } } </script> </body> </html>
关键修改说明:
修复列表显示逻辑:
原代码每次按键都会切换列表的显示/隐藏状态,导致输入过程中列表反复消失。现在改为:当输入框有内容时显示列表,清空输入时隐藏列表,符合搜索功能的常规逻辑。实现前缀匹配:
把原代码中的indexOf(filter) > -1(只要包含关键词就匹配)替换为startsWith(filter)(只有字符串以关键词开头才匹配),同时保持了大小写不敏感的特性(通过toUpperCase()统一转换为大写后比较)。
测试一下:
- 输入"a":会显示亚洲、非洲、南极洲(三者的拼音前缀都是A开头)
- 输入"an":只会显示南极洲(拼音前缀为AN)
- 输入"sou":只会显示南美洲(拼音前缀为SOU)
完全符合你的需求!
内容的提问来源于stack exchange,提问作者Nsikak Akpabio
相关产品推荐
相关产品推荐

