diff options
-rw-r--r-- | js/main.js | 44 | ||||
-rw-r--r-- | search.html | 5 |
2 files changed, 46 insertions, 3 deletions
diff --git a/js/main.js b/js/main.js index ad460a2..72c46a0 100644 --- a/js/main.js +++ b/js/main.js @@ -41,6 +41,50 @@ $(function () { } }); +$(function() { + function getQueryVariable(variable){ + var query = window.location.search.substring(1); + var vars = query.split("&"); + for (var i=0;i<vars.length;i++) { + var pair = vars[i].split("="); + if(pair[0] == variable){return pair[1];} + } + return(false); + } + var keyword = decodeURI(getQueryVariable("kw")); + + if (!keyword) return; + + // 转义正则表达式特殊字符,避免安全问题 + const escapedKeyword = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + // 创建不区分大小写的正则表达式(全局匹配) + const regex = new RegExp(`(${escapedKeyword})`, 'gi'); + + // 递归遍历并高亮文本节点 + function highlightTextNodes(element) { + $(element).contents().each(function() { + if (this.nodeType === Node.TEXT_NODE) { + const $this = $(this); + const text = $this.text(); + // 使用正则替换并保留原始大小写 + if (regex.test(text)) { + const replaced = text.replace(regex, '<mark>$1</mark>'); + $this.replaceWith(replaced); + } + } else if ( + this.nodeType === Node.ELEMENT_NODE && + !$(this).is('script, style, noscript, textarea') + ) { + highlightTextNodes(this); + } + }); + } + + $('section').each(function() { + highlightTextNodes(this); + }); +}); + today = new Date(); timeold = (today.getTime() - lastUpdated.getTime()); secondsold = Math.floor(timeold / 1000); diff --git a/search.html b/search.html index 1b01972..7f392cd 100644 --- a/search.html +++ b/search.html @@ -8,8 +8,7 @@ title: 搜索 <ul id="results-container"></ul> <script src="/js/simple-jekyll-search.min.js"></script> <script> -function getQueryVariable(variable) -{ +function getQueryVariable(variable){ var query = window.location.search.substring(1); var vars = query.split("&"); for (var i=0;i<vars.length;i++) { @@ -29,7 +28,7 @@ getSearchJSON(function(json){ searchInput: sbox, resultsContainer: document.getElementById('results-container'), json: json, - searchResultTemplate: '<p><li>{date} - <a href="{url}">{title}</a></li></p>', + searchResultTemplate: '<p><li>{date} - <a href="{url}?kw={query}">{title}</a></li></p>', limit: 20 }); sjs.search(mykeyword); |