mirror of
				https://github.com/Mabbs/mabbs.github.io
				synced 2025-11-04 09:00:50 +08:00 
			
		
		
		
	
		
			
	
	
		
			78 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			78 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								$(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);
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								});
							 |