实现友链搜索功能

402 字
2 分钟
实现友链搜索功能

搜索框代码#

<!-- 搜索框 -->
<div class="mb-4">
<div class="relative">
<input
type="text"
id="friend-search"
placeholder="搜索友链..."
class="w-full px-4 py-2.5 pl-10 rounded-lg border border-(--line-divider) bg-(--card-bg) text-neutral-900 dark:text-neutral-100 placeholder-neutral-400 dark:placeholder-neutral-500 focus:outline-none focus:border-(--primary) focus:ring-2 focus:ring-(--primary)/20 transition-all duration-200"
/>
<Icon
name="material-symbols:search"
class="absolute left-3 top-1/2 -translate-y-1/2 text-neutral-400 dark:text-neutral-500 text-xl"
/>
<button
id="clear-search"
class="absolute right-3 top-1/2 -translate-y-1/2 text-neutral-400 hover:text-neutral-600 dark:hover:text-neutral-300 transition-colors hidden"
aria-label="清除搜索"
>
<Icon name="material-symbols:close" class="text-lg" />
</button>
</div>
</div>
<!-- 无搜索结果提示 -->
<div id="no-results" class="hidden text-center py-12">
<Icon
name="material-symbols:search-off-rounded"
class="text-5xl text-neutral-300 dark:text-neutral-600 mx-auto mb-3"
/>
<p class="text-neutral-500 dark:text-neutral-400">未找到匹配的友链</p>
<p class="text-sm text-neutral-400 dark:text-neutral-500 mt-1">请尝试其他关键词</p>
</div>

友链搜索功能#

if (!customElements.get("friend-filter")) {
// 其他代码
}
// 友链搜索功能
(function() {
// 确保 DOM 加载完成后再执行
function initSearch() {
const searchInput = document.getElementById('friend-search');
const clearBtn = document.getElementById('clear-search');
const noResults = document.getElementById('no-results');
const cards = document.querySelectorAll('.friend-card');
if (!searchInput || cards.length === 0) {
return; // DOM 还未加载完成,稍后重试
}
let debounceTimer;
// 防抖函数
function debounce(func, delay) {
return function(...args) {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => func.apply(this, args), delay);
};
}
// 搜索过滤逻辑
function performSearch(query) {
const searchTerm = query.toLowerCase().trim();
let visibleCount = 0;
cards.forEach((card) => {
const title = (card.querySelector('.font-bold')?.textContent || '').toLowerCase();
const desc = (card.querySelector('.line-clamp-1')?.textContent || '').toLowerCase();
const url = (card.href || '').toLowerCase();
if (
searchTerm === '' ||
title.includes(searchTerm) ||
desc.includes(searchTerm) ||
url.includes(searchTerm)
) {
card.style.display = '';
card.classList.add('animate-fade-in-up');
visibleCount++;
} else {
card.style.display = 'none';
card.classList.remove('animate-fade-in-up');
}
});
// 显示/隐藏无结果提示
if (noResults) {
if (visibleCount === 0 && searchTerm !== '') {
noResults.classList.remove('hidden');
} else {
noResults.classList.add('hidden');
}
}
}
// 绑定搜索事件(带防抖)
searchInput.addEventListener('input', debounce(function(e) {
const query = e.target.value;
performSearch(query);
// 显示/隐藏清除按钮
if (clearBtn) {
if (query.length > 0) {
clearBtn.classList.remove('hidden');
} else {
clearBtn.classList.add('hidden');
}
}
}, 200));
// 绑定清除按钮
if (clearBtn) {
clearBtn.addEventListener('click', function() {
searchInput.value = '';
performSearch('');
this.classList.add('hidden');
searchInput.focus();
});
}
}
// 监听 DOM 加载完成事件
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initSearch);
} else {
initSearch();
}
})();

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
实现友链搜索功能
https://hyde.seasir.top/blog/friends/
作者
Hyde
发布于
2026-05-19
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Hyde
Hello, I'm Hyde.
📢 欢迎来访者
👋🏻 Hi,我是Hyde,欢迎您!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
4
分类
3
标签
3
总字数
1,514
运行时长
0
最后活动
0 天前

文章目录