软件工程日报--智慧搜索
智慧搜索
概要
我想实现一个智慧搜索的功能,大概是这样,我有一个输入框,和基本数据,然后我当我输入几个关键信息的时候,搜索框会给我推荐出相关信息。
类似一下这种
实现方法
首先我要一个数组来存储数据,可以是静态实现也可以是动态实现。这里直接使用静态数据,想使用动态也可用axios进行异步请求尝试一下
然后要知道涉及的一些操作,处理输入,显示推荐结果,高亮匹配文字,选中推荐项目以后操作,和点击外部关闭推荐栏
源码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>智能搜索推荐</title>
<style>
.search-container {
position: relative;
width: 500px;
margin: 100px auto;
}
#searchInput {
width: 100%;
padding: 12px 20px;
font-size: 16px;
border: 2px solid #ddd;
border-radius: 25px;
outline: none;
transition: border-color 0.3s;
}
#searchInput:focus {
border-color: #4CAF50;
}
.suggestions-box {
position: absolute;
width: 100%;
max-height: 300px;
margin-top: 8px;
background: white;
border-radius: 12px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
overflow-y: auto;
display: none;
z-index: 1000;
}
.suggestion-item {
padding: 12px 20px;
cursor: pointer;
transition: background 0.2s;
}
.suggestion-item:hover {
background: #f5f5f5;
}
.highlight {
color: #4CAF50;
font-weight: bold;
}
</style>
</head>
<body>
<div class="search-container">
<input type="text"
id="searchInput"
placeholder="输入关键词搜索..."
autocomplete="off">
<div class="suggestions-box" id="suggestionsBox"></div>
</div>
<script>
// 模拟数据(可替换为真实API)
const mockData = [
"JavaScript教程",
"Python编程入门",
"Java基础教学",
"CSS高级技巧",
"React开发指南",
"Vue3新特性解读",
"Node.js实战项目",
"Webpack配置指南"
];
const searchInput = document.getElementById('searchInput');
const suggestionsBox = document.getElementById('suggestionsBox');
// 输入监听(带防抖)
let timeout;
searchInput.addEventListener('input', function(e) {
clearTimeout(timeout);
timeout = setTimeout(() => handleInput(e.target.value), 300);
});
// 处理输入
function handleInput(value) {
if (!value) {
suggestionsBox.style.display = 'none';
return;
}
const filtered = mockData.filter(item =>
item.toLowerCase().includes(value.toLowerCase())
);
showSuggestions(filtered, value);
}
// 显示推荐结果
function showSuggestions(results, query) {
suggestionsBox.innerHTML = '';
if (results.length === 0) {
suggestionsBox.style.display = 'none';
return;
}
results.forEach(text => {
const div = document.createElement('div');
div.className = 'suggestion-item';
div.innerHTML = highlightMatch(text, query);
div.addEventListener('click', () => selectSuggestion(text));
suggestionsBox.appendChild(div);
});
suggestionsBox.style.display = 'block';
}
// 高亮匹配文字
function highlightMatch(text, query) {
const regex = new RegExp(`(${query})`, 'gi');
return text.replace(regex, '<span class="highlight">$1</span>');
}
// 选中推荐项
function selectSuggestion(text) {
searchInput.value = text;
suggestionsBox.style.display = 'none';
}
// 点击外部关闭推荐框
document.addEventListener('click', (e) => {
if (!e.target.closest('.search-container')) {
suggestionsBox.style.display = 'none';
}
});
</script>
</body>
</html>