diff options
Diffstat (limited to 'assets/js/main_new.js')
-rw-r--r-- | assets/js/main_new.js | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/assets/js/main_new.js b/assets/js/main_new.js new file mode 100644 index 0000000..fd0170f --- /dev/null +++ b/assets/js/main_new.js @@ -0,0 +1,78 @@ +$(function () { + $("div#landlord").mouseenter(function () { + $("div.live_ico_box").fadeIn(); + }); + $("div#landlord").mouseleave(function () { + $("div.live_ico_box").fadeOut(); + }); + + const urlParams = new URLSearchParams(window.location.search); + const keyword = urlParams.get('kw')?.trim(); + + if (!keyword) return; + + // 转义正则表达式特殊字符,避免安全问题 + const escapedKeyword = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + // 创建不区分大小写的正则表达式(全局匹配) + const regex = new RegExp(`(${escapedKeyword})`, 'gi'); + + // 递归遍历并高亮文本节点 + const escapeHTML = str => str.replace(/[&<>"']/g, + tag => ({ + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }[tag] || tag)); + function highlightTextNodes(element) { + $(element).contents().each(function () { + if (this.nodeType === Node.TEXT_NODE) { + const $this = $(this); + const text = escapeHTML($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); + }); + + var codeBlocks = document.querySelectorAll('div.highlight'); + + codeBlocks.forEach(function (codeBlock) { + var copyButton = document.createElement('button'); + copyButton.className = 'copy'; + copyButton.type = 'button'; + copyButton.innerText = '📋'; + + codeBlock.append(copyButton); + + copyButton.addEventListener('click', function () { + var code = codeBlock.querySelector('pre code').innerText.trim(); + window.navigator.clipboard.writeText(code) + .then(() => { + copyButton.innerText = '✅'; + }) + .catch(err => { + copyButton.innerText = '❌'; + console.error('Failed to copy:', err); + }); + + setTimeout(function () { + copyButton.innerText = '📋'; + }, 1500); + }); + }); +}); \ No newline at end of file |