mirror of https://github.com/Mabbs/mabbs.github.io
				
				
				
			
							parent
							
								
									97e0ef3c81
								
							
						
					
					
						commit
						ac554c5535
					
				
				 3 changed files with 91 additions and 94 deletions
			
			
		@ -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