自动完成(Autocomplete)是一种用户界面功能,当用户在输入框中输入内容时,系统会预测用户可能想要输入的内容并提供建议列表。这种功能可以显著提高用户体验和数据输入的准确性。
<!DOCTYPE html>
<html>
<head>
<title>自动完成示例</title>
<style>
.autocomplete {
position: relative;
display: inline-block;
}
.autocomplete-items {
position: absolute;
border: 1px solid #d4d4d4;
border-bottom: none;
border-top: none;
z-index: 99;
top: 100%;
left: 0;
right: 0;
}
.autocomplete-items div {
padding: 10px;
cursor: pointer;
background-color: #fff;
border-bottom: 1px solid #d4d4d4;
}
.autocomplete-items div:hover {
background-color: #e9e9e9;
}
</style>
</head>
<body>
<h2>自动完成示例</h2>
<div class="autocomplete" style="width:300px;">
<input id="myInput" type="text" placeholder="输入国家名称...">
<div id="autocomplete-list" class="autocomplete-items"></div>
</div>
<script>
// 示例数据
var countries = ["中国", "美国", "英国", "加拿大", "澳大利亚", "日本", "德国", "法国", "意大利", "西班牙"];
function autocomplete(input, arr) {
input.addEventListener("input", function(e) {
var val = this.value;
var list = document.getElementById("autocomplete-list");
list.innerHTML = '';
if (!val) { return false; }
// 过滤匹配项
var matches = arr.filter(function(item) {
return item.toLowerCase().includes(val.toLowerCase());
});
// 显示匹配项
for (var i = 0; i < matches.length; i++) {
var item = document.createElement("div");
item.innerHTML = "<strong>" + matches[i].substr(0, val.length) + "</strong>";
item.innerHTML += matches[i].substr(val.length);
item.innerHTML += "<input type='hidden' value='" + matches[i] + "'>";
item.addEventListener("click", function(e) {
input.value = this.getElementsByTagName("input")[0].value;
list.innerHTML = '';
});
list.appendChild(item);
}
});
}
// 初始化自动完成
autocomplete(document.getElementById("myInput"), countries);
</script>
</body>
</html>
import React, { useState } from 'react';
const Autocomplete = ({ suggestions }) => {
const [filteredSuggestions, setFilteredSuggestions] = useState([]);
const [activeSuggestionIndex, setActiveSuggestionIndex] = useState(0);
const [showSuggestions, setShowSuggestions] = useState(false);
const [input, setInput] = useState("");
const onChange = (e) => {
const userInput = e.target.value;
// 过滤不匹配的选项
const unLinked = suggestions.filter(
suggestion => suggestion.toLowerCase().indexOf(userInput.toLowerCase()) > -1
);
setInput(e.target.value);
setFilteredSuggestions(unLinked);
setActiveSuggestionIndex(0);
setShowSuggestions(true);
};
const onClick = (e) => {
setFilteredSuggestions([]);
setInput(e.target.innerText);
setActiveSuggestionIndex(0);
setShowSuggestions(false);
};
const onKeyDown = (e) => {
// 用户按下回车键
if (e.keyCode === 13) {
setInput(filteredSuggestions[activeSuggestionIndex]);
setFilteredSuggestions([]);
setActiveSuggestionIndex(0);
setShowSuggestions(false);
}
// 用户按下上箭头
else if (e.keyCode === 38) {
if (activeSuggestionIndex === 0) {
return;
}
setActiveSuggestionIndex(activeSuggestionIndex - 1);
}
// 用户按下下箭头
else if (e.keyCode === 40) {
if (activeSuggestionIndex - 1 === filteredSuggestions.length) {
return;
}
setActiveSuggestionIndex(activeSuggestionIndex + 1);
}
};
const SuggestionsListComponent = () => {
return filteredSuggestions.length ? (
<ul className="suggestions">
{filteredSuggestions.map((suggestion, index) => {
let className;
if (index === activeSuggestionIndex) {
className = "suggestion-active";
}
return (
<li className={className} key={suggestion} onClick={onClick}>
{suggestion}
</li>
);
})}
</ul>
) : (
<div className="no-suggestions">
<em>无匹配项</em>
</div>
);
};
return (
<>
<input
type="text"
onChange={onChange}
onKeyDown={onKeyDown}
value={input}
/>
{showSuggestions && input && <SuggestionsListComponent />}
</>
);
};
export default Autocomplete;
可能原因:
解决方案:
可能原因:
解决方案:
可能原因:
解决方案:
可能原因:
解决方案:
function debounce(func, wait) {
let timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, args), wait);
};
}
// 使用示例
input.addEventListener('input', debounce(handleInput, 300));
自动完成功能是现代Web应用中的重要组成部分,合理实现可以显著提升用户体验。根据具体需求选择适当的实现方式,并注意性能优化和无障碍访问。
没有搜到相关的文章