mirror of https://github.com/Mabbs/mabbs.github.io
				
				
				
			
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.6 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);
 | |
|     });
 | |
| });
 | |
| 
 | |
| $(function () {
 | |
|     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);
 | |
|         });
 | |
|     });
 | |
| }); |