/**
* 搜索功能JavaScript文件
* 实现搜索框的弹出/收起动画和交互功能
* 包含新闻搜索模块的交互功能
*/
// 新闻搜索模块功能
(function() {
'use strict';
// 等待DOM加载完成
document.addEventListener('DOMContentLoaded', function() {
initNewsSearch();
});
function initNewsSearch() {
const searchInput = document.getElementById('news-search');
const categorySelect = document.getElementById('news-category');
const searchForm = document.querySelector('.news-search-form');
const suggestionsContainer = document.getElementById('search-suggestions');
if (!searchInput || !categorySelect || !searchForm) {
return;
}
// 搜索建议数据(可以从后端获取)
let searchSuggestions = [];
let currentSuggestionIndex = -1;
// 分类下拉动画
categorySelect.addEventListener('focus', function() {
this.style.transform = 'scale(1.02)';
});
categorySelect.addEventListener('blur', function() {
this.style.transform = 'scale(1)';
});
// 分类选择改变时自动提交表单
categorySelect.addEventListener('change', function() {
const selectedOption = this.options[this.selectedIndex];
const url = selectedOption.getAttribute('data-url');
const searchVal = searchInput.value.trim();
// 如果搜索词为空且有目标URL,直接跳转(用于“显示全部”或切换分类)
if (searchVal === '' && url) {
window.location.href = url;
} else {
searchForm.submit();
}
});
// 搜索输入框事件
searchInput.addEventListener('input', function() {
const query = this.value.trim();
if (query.length >= 2) {
fetchSearchSuggestions(query);
} else {
hideSuggestions();
}
});
// 键盘事件处理
searchInput.addEventListener('keydown', function(e) {
if (e.key === 'Enter') {
e.preventDefault();
if (currentSuggestionIndex >= 0 && searchSuggestions[currentSuggestionIndex]) {
this.value = searchSuggestions[currentSuggestionIndex];
hideSuggestions();
}
searchForm.submit();
} else if (e.key === 'ArrowDown') {
e.preventDefault();
navigateSuggestions(1);
} else if (e.key === 'ArrowUp') {
e.preventDefault();
navigateSuggestions(-1);
} else if (e.key === 'Escape') {
hideSuggestions();
}
});
// 点击外部隐藏建议
document.addEventListener('click', function(e) {
if (!searchInput.contains(e.target) && !suggestionsContainer.contains(e.target)) {
hideSuggestions();
}
});
// 获取搜索建议
function fetchSearchSuggestions(query) {
// 模拟搜索建议(实际项目中应该从后端API获取)
const mockSuggestions = [
'新能源汽车',
'新能源政策',
'新能源技术',
'新能源发展',
'新能源投资',
'太阳能发电',
'风能发电',
'储能技术',
'电池技术',
'充电桩建设'
];
searchSuggestions = mockSuggestions.filter(item =>
item.toLowerCase().includes(query.toLowerCase())
).slice(0, 5);
showSuggestions();
}
// 显示搜索建议
function showSuggestions() {
if (searchSuggestions.length === 0) {
hideSuggestions();
return;
}
let html = '';
searchSuggestions.forEach((suggestion, index) => {
html += `
${suggestion}
`;
});
suggestionsContainer.innerHTML = html;
suggestionsContainer.classList.add('show');
// 绑定建议项点击事件
suggestionsContainer.querySelectorAll('.suggestion-item').forEach(item => {
item.addEventListener('click', function() {
searchInput.value = this.textContent;
hideSuggestions();
searchForm.submit();
});
item.addEventListener('mouseenter', function() {
currentSuggestionIndex = parseInt(this.dataset.index);
updateSuggestionHighlight();
});
});
}
// 隐藏搜索建议
function hideSuggestions() {
suggestionsContainer.classList.remove('show');
currentSuggestionIndex = -1;
}
// 导航搜索建议
function navigateSuggestions(direction) {
if (searchSuggestions.length === 0) return;
currentSuggestionIndex += direction;
if (currentSuggestionIndex < 0) {
currentSuggestionIndex = searchSuggestions.length - 1;
} else if (currentSuggestionIndex >= searchSuggestions.length) {
currentSuggestionIndex = 0;
}
updateSuggestionHighlight();
}
// 更新建议高亮
function updateSuggestionHighlight() {
const items = suggestionsContainer.querySelectorAll('.suggestion-item');
items.forEach((item, index) => {
if (index === currentSuggestionIndex) {
item.classList.add('active');
} else {
item.classList.remove('active');
}
});
}
// 表单提交处理
searchForm.addEventListener('submit', function(e) {
const query = searchInput.value.trim();
const category = categorySelect.value;
if (!query && !category) {
e.preventDefault();
searchInput.focus();
return;
}
// 添加加载动画
const searchButton = searchForm.querySelector('.search-button');
if (searchButton) {
searchButton.style.opacity = '0.7';
searchButton.style.transform = 'scale(0.95)';
}
});
// 平滑的焦点动画
searchInput.addEventListener('focus', function() {
this.parentElement.style.transform = 'scale(1.02)';
this.parentElement.style.boxShadow = '0 0 0 3px rgba(0, 123, 255, 0.1)';
});
searchInput.addEventListener('blur', function() {
this.parentElement.style.transform = 'scale(1)';
this.parentElement.style.boxShadow = 'none';
});
}
// 页面加载完成后初始化新闻搜索功能
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initNewsSearch);
} else {
initNewsSearch();
}
})();
(function() {
'use strict';
// DOM元素
let searchToggle, searchOverlay, searchInput, searchClose, searchForm;
// 初始化函数
function initSearch() {
// 获取DOM元素
searchToggle = document.getElementById('searchToggle');
searchOverlay = document.getElementById('searchOverlay');
searchInput = document.getElementById('searchInput');
searchClose = document.getElementById('searchClose');
searchForm = document.querySelector('.search-form');
if (!searchToggle || !searchOverlay) {
return;
}
// 绑定事件
bindEvents();
// 初始化GSAP动画(如果可用)
if (typeof gsap !== 'undefined') {
initGSAPAnimations();
}
}
// 绑定事件
function bindEvents() {
// 搜索按钮点击事件
searchToggle.addEventListener('click', openSearch);
// 关闭按钮点击事件
if (searchClose) {
searchClose.addEventListener('click', closeSearch);
}
// 遮罩层点击事件
searchOverlay.addEventListener('click', function(e) {
if (e.target === searchOverlay) {
closeSearch();
}
});
// ESC键关闭搜索
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape' && searchOverlay.classList.contains('active')) {
closeSearch();
}
});
// 搜索表单提交事件
if (searchForm) {
searchForm.addEventListener('submit', handleSearchSubmit);
}
// 搜索输入框事件
if (searchInput) {
searchInput.addEventListener('input', handleSearchInput);
searchInput.addEventListener('focus', handleSearchFocus);
searchInput.addEventListener('blur', handleSearchBlur);
}
}
// 打开搜索框
function openSearch() {
searchOverlay.classList.add('active');
searchToggle.classList.add('active');
document.body.style.overflow = 'hidden';
// 延迟聚焦到输入框
setTimeout(() => {
if (searchInput) {
searchInput.focus();
}
}, 400);
// 触发自定义事件
document.dispatchEvent(new CustomEvent('searchOpened'));
}
// 关闭搜索框
function closeSearch() {
searchOverlay.classList.remove('active');
searchToggle.classList.remove('active');
document.body.style.overflow = '';
// 清空输入框(可选)
if (searchInput) {
// searchInput.value = '';
}
// 触发自定义事件
document.dispatchEvent(new CustomEvent('searchClosed'));
}
// 处理搜索表单提交
function handleSearchSubmit(e) {
const query = searchInput.value.trim();
if (!query) {
e.preventDefault();
searchInput.focus();
// 添加震动效果
if (typeof gsap !== 'undefined') {
gsap.to(searchInput, {
x: [-10, 10, -8, 8, -6, 6, -4, 4, -2, 2, 0],
duration: 0.6,
ease: "power2.out"
});
} else {
searchInput.classList.add('shake');
setTimeout(() => {
searchInput.classList.remove('shake');
}, 600);
}
return false;
}
// 可以在这里添加搜索分析代码
if (typeof gtag !== 'undefined') {
gtag('event', 'search', {
search_term: query
});
}
}
// 处理搜索输入
function handleSearchInput(e) {
const query = e.target.value.trim();
// 可以在这里实现实时搜索建议
if (query.length >= 2) {
// debounce搜索请求
clearTimeout(handleSearchInput.timeout);
handleSearchInput.timeout = setTimeout(() => {
fetchSearchSuggestions(query);
}, 300);
} else {
hideSuggestions();
}
}
// 搜索输入框获得焦点
function handleSearchFocus() {
searchInput.parentElement.classList.add('focused');
}
// 搜索输入框失去焦点
function handleSearchBlur() {
searchInput.parentElement.classList.remove('focused');
}
// 获取搜索建议(示例实现)
function fetchSearchSuggestions(query) {
// 这里可以实现AJAX搜索建议
// 示例:向WordPress REST API发送请求
/*
fetch(`${themeData.ajaxUrl}?action=search_suggestions&query=${encodeURIComponent(query)}&nonce=${themeData.nonce}`)
.then(response => response.json())
.then(data => {
if (data.success) {
showSuggestions(data.data);
}
})
.catch(error => {
console.error('搜索建议获取失败:', error);
});
*/
}
// 显示搜索建议
function showSuggestions(suggestions) {
let suggestionsContainer = document.querySelector('.search-suggestions');
if (!suggestionsContainer) {
suggestionsContainer = document.createElement('div');
suggestionsContainer.className = 'search-suggestions';
searchInput.parentElement.appendChild(suggestionsContainer);
}
if (suggestions && suggestions.length > 0) {
suggestionsContainer.innerHTML = suggestions.map(item =>
`${item.title}
`
).join('');
// 绑定建议项点击事件
suggestionsContainer.querySelectorAll('.search-suggestion-item').forEach(item => {
item.addEventListener('click', function() {
searchInput.value = this.dataset.value;
hideSuggestions();
searchForm.submit();
});
});
suggestionsContainer.classList.add('show');
} else {
hideSuggestions();
}
}
// 隐藏搜索建议
function hideSuggestions() {
const suggestionsContainer = document.querySelector('.search-suggestions');
if (suggestionsContainer) {
suggestionsContainer.classList.remove('show');
}
}
// 初始化GSAP动画
function initGSAPAnimations() {
// 注册ScrollTrigger插件(如果可用)
if (typeof ScrollTrigger !== 'undefined') {
gsap.registerPlugin(ScrollTrigger);
}
// 搜索按钮悬停动画
searchToggle.addEventListener('mouseenter', function() {
gsap.to(this.querySelector('.search-icon'), {
rotation: 90,
scale: 1.1,
duration: 0.3,
ease: "back.out(1.7)"
});
});
searchToggle.addEventListener('mouseleave', function() {
gsap.to(this.querySelector('.search-icon'), {
rotation: 0,
scale: 1,
duration: 0.3,
ease: "back.out(1.7)"
});
});
// 自定义搜索框打开动画
document.addEventListener('searchOpened', function() {
const searchBox = document.querySelector('.search-box');
const searchInputWrapper = document.querySelector('.search-input-wrapper');
const searchSubmit = document.querySelector('.search-submit');
// 重置初始状态
gsap.set([searchBox, searchInputWrapper, searchSubmit], {
opacity: 0,
y: 30,
scale: 0.9
});
// 创建时间线动画
const tl = gsap.timeline();
tl.to(searchBox, {
opacity: 1,
y: 0,
scale: 1,
duration: 0.4,
ease: "back.out(1.7)"
})
.to(searchInputWrapper, {
opacity: 1,
y: 0,
scale: 1,
duration: 0.3,
ease: "power2.out"
}, "-=0.2")
.to(searchSubmit, {
opacity: 1,
y: 0,
scale: 1,
duration: 0.3,
ease: "power2.out"
}, "-=0.1");
});
}
// 工具函数:防抖
function debounce(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
}
// 工具函数:节流
function throttle(func, limit) {
let inThrottle;
return function() {
const args = arguments;
const context = this;
if (!inThrottle) {
func.apply(context, args);
inThrottle = true;
setTimeout(() => inThrottle = false, limit);
}
};
}
// 页面加载完成后初始化
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initSearch);
} else {
initSearch();
}
// 导出到全局(用于调试)
window.ThemeSearch = {
open: openSearch,
close: closeSearch,
toggle: function() {
if (searchOverlay && searchOverlay.classList.contains('active')) {
closeSearch();
} else {
openSearch();
}
}
};
})();