|
|
|
@ -13,28 +13,19 @@ var talkAPI = BlogAPI + "/ai_chat"; |
|
|
|
$(function () { $backToTopFun(); }); |
|
|
|
})(); |
|
|
|
$(function () { |
|
|
|
$("div#landlord").mouseenter(function () { |
|
|
|
$("div.live_ico_box").fadeIn(); |
|
|
|
}); |
|
|
|
$("div#landlord").mouseleave(function () { |
|
|
|
$("div.live_ico_box").fadeOut(); |
|
|
|
}); |
|
|
|
function showHitS(hits) { |
|
|
|
$.get(BlogAPI + "/count_click?id=" + hits.id, function (data) { |
|
|
|
hits.innerHTML = Number(data); |
|
|
|
}); |
|
|
|
} |
|
|
|
function showHitCount() { |
|
|
|
var visitors = $(".visitors-index"); |
|
|
|
for (var i = 0; i < visitors.length; i++) { |
|
|
|
showHitS(visitors[i]); |
|
|
|
} |
|
|
|
|
|
|
|
$(".visitors-index").each(function() { |
|
|
|
var $elem = $(this); |
|
|
|
$.get(BlogAPI + "/count_click?id=" + $elem.attr('id'), function(data) { |
|
|
|
$elem.text(Number(data)); |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
function addCount() { |
|
|
|
var visitors = $(".visitors"); |
|
|
|
$.get(BlogAPI + "/count_click_add?id=" + visitors[0].id, function (data) { |
|
|
|
visitors[0].innerHTML = Number(data); |
|
|
|
var $visitor = $(".visitors:first"); |
|
|
|
$.get(BlogAPI + "/count_click_add?id=" + $visitor.attr('id'), function(data) { |
|
|
|
$visitor.text(Number(data)); |
|
|
|
}); |
|
|
|
} |
|
|
|
if ($('.visitors').length == 1) { |
|
|
|
@ -44,79 +35,6 @@ $(function () { |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
$(function () { |
|
|
|
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); |
|
|
|
}); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
today = new Date(); |
|
|
|
timeold = (today.getTime() - lastUpdated.getTime()); |
|
|
|
secondsold = Math.floor(timeold / 1000); |
|
|
|
|