Files
blog-astro/public/js/twikoo-loader.js
2025-12-09 22:08:16 +08:00

85 lines
2.3 KiB
JavaScript

(function () {
var TWIKOO_SRC =
'https://cdn.jsdelivr.net/npm/twikoo@1.6.44/dist/twikoo.min.js'
var TARGET_SELECTOR = '#tcomment'
var SCRIPT_ID = 'twikoo-cdn-script'
function renderTwikoo() {
var container = document.querySelector(TARGET_SELECTOR)
if (!container) {
console.warn('[twikoo-loader] target container not found')
return
}
if (!window.twikoo) {
console.warn('[twikoo-loader] twikoo is not ready when render called')
return
}
console.info('[twikoo-loader] renderTwikoo: init comments')
container.innerHTML = ''
window.twikoo.init({
envId: 'https://twikoo.hk.nvme0n1p.dev/',
el: TARGET_SELECTOR,
})
}
function ensureScript() {
var existing = document.getElementById(SCRIPT_ID)
if (existing) {
if (existing.dataset.failed === 'true') {
console.warn('[twikoo-loader] previous load failed, removing script')
existing.remove()
} else {
if (!window.twikoo) {
console.info('[twikoo-loader] script already present, waiting for load')
existing.addEventListener('load', renderTwikoo, { once: true })
}
return
}
}
console.info('[twikoo-loader] injecting script', TWIKOO_SRC)
var script = document.createElement('script')
script.id = SCRIPT_ID
script.src = TWIKOO_SRC
script.async = true
script.onload = function () {
console.info('[twikoo-loader] twikoo script loaded')
script.dataset.loaded = 'true'
renderTwikoo()
}
script.onerror = function (err) {
script.dataset.failed = 'true'
console.error('[twikoo-loader] Failed to load Twikoo:', err)
console.error('Failed to load Twikoo:', err)
}
document.head.appendChild(script)
}
function init() {
console.info('[twikoo-loader] init called')
ensureScript()
if (window.twikoo) {
renderTwikoo()
}
}
function onLoad() {
init()
}
// 手动触发入口,便于在需要时重新初始化
window.runTwikooComments = onLoad
if (document.readyState === 'complete') {
onLoad()
} else {
window.addEventListener('load', onLoad, { once: true })
}
document.addEventListener('astro:page-load', onLoad)
document.addEventListener('astro:after-swap', onLoad)
})()