mirror of https://github.com/Mabbs/mabbs.github.io
				
				
				
			
							parent
							
								
									97e0ef3c81
								
							
						
					
					
						commit
						ac554c5535
					
				@ -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);
 | 
				
			||||
        });
 | 
				
			||||
    });
 | 
				
			||||
});
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue