window.initSearch = function() { initSearchModal(); initInlineSearch(); }; function loadSearchIndex() { if (!window.searchIndex) { return fetch('/index.json') .then(response => response.json()) .then(data => { window.searchIndex = data; return data; }) .catch(err => console.error('Failed to load search index:', err)); } return Promise.resolve(window.searchIndex); } function initSearchModal() { var searchBtn = document.getElementById('search-btn'); var searchModal = document.getElementById('search-modal'); if (searchBtn && searchModal) { // Clone to remove old listeners var newSearchBtn = searchBtn.cloneNode(true); searchBtn.parentNode.replaceChild(newSearchBtn, searchBtn); searchBtn = newSearchBtn; searchBtn.addEventListener('click', function() { searchModal.classList.add('show'); var input = document.getElementById('search-input'); if (input) setTimeout(function() { input.focus(); }, 100); loadSearchIndex(); }); // Close logic var closeBtn = searchModal.querySelector('.close-search'); if (closeBtn) { closeBtn.onclick = function() { searchModal.classList.remove('show'); }; } // Click outside to close searchModal.onclick = function(e) { if (e.target === searchModal) { searchModal.classList.remove('show'); } }; // Search Input Logic var searchInput = document.getElementById('search-input'); var searchResults = document.getElementById('search-results'); if (searchInput && searchResults) { // Clone input to remove old listeners var newInput = searchInput.cloneNode(true); searchInput.parentNode.replaceChild(newInput, searchInput); searchInput = newInput; // Clone results to remove old listeners var newResults = searchResults.cloneNode(true); searchResults.parentNode.replaceChild(newResults, searchResults); searchResults = newResults; // Close modal when a result is clicked searchResults.addEventListener('click', function(e) { if (e.target.closest('a')) { searchModal.classList.remove('show'); } }); searchInput.addEventListener('input', function() { var query = this.value.trim().toLowerCase(); if (!window.searchIndex || query.length === 0) { searchResults.innerHTML = '
输入关键词并回车进行搜索
'; return; } var results = window.searchIndex.filter(function(item) { return (item.title && item.title.toLowerCase().includes(query)) || (item.summary && item.summary.toLowerCase().includes(query)); }); if (results.length > 0) { var html = results.map(function(item) { return ` `; }).join(''); searchResults.innerHTML = html; // Refresh PJAX to recognize new links if (window.pjax) { window.pjax.refresh(searchResults); } } else { searchResults.innerHTML = '未找到相关文章
'; } }); } } } function initInlineSearch() { var header = document.getElementById('essay-header'); var searchContainer = document.getElementById('search-container'); var input = document.getElementById('inline-search-input'); var resultsContainer = document.getElementById('inline-search-results'); window.toggleSearchMode = function(show) { if (!header || !searchContainer || !input || !resultsContainer) return; if (show) { header.style.display = 'none'; searchContainer.style.display = 'block'; input.focus(); loadSearchIndex(); } else { header.style.display = 'inline-flex'; searchContainer.style.display = 'none'; input.value = ''; resultsContainer.classList.remove('show'); resultsContainer.innerHTML = ''; } }; if (!header || !searchContainer || !input || !resultsContainer) return; // Input Event var newInput = input.cloneNode(true); input.parentNode.replaceChild(newInput, input); input = newInput; input.addEventListener('input', function() { var query = this.value.trim().toLowerCase(); if (query.length === 0) { resultsContainer.classList.remove('show'); resultsContainer.innerHTML = ''; return; } if (!window.searchIndex) return; var results = window.searchIndex.filter(function(item) { return (item.title && item.title.toLowerCase().includes(query)) || (item.summary && item.summary.toLowerCase().includes(query)); }); if (results.length > 0) { var html = results.slice(0, 5).map(function(item) { return ` ${item.title}