折腾折腾HexoAnZhiYu主题todayCard调用今日诗词
Huazzi 预期实现的功能
在AnZhiYu主题中的首页顶部右侧(todayCard)的tittle文案调用今日诗词API,以自动显示诗词。

实现方式
可以通过「外部注入」的方式实现这个功能,而不需要修改原项目的代码。这样可以避免对原项目造成任何不必要的改动,降低引起其他问题的风险。
以下是一个使用外部注入方式的解决方案,可以将它作为一个独立的脚本添加到你的网站:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| (function() { const injectTodayPoetry = () => { const checkAndUpdatePoetry = () => { const todayCardTitle = document.querySelector(".todayCard-title"); if (todayCardTitle) { fetchAndUpdatePoetry(todayCardTitle); observeTodayCard(); return true; } return false; };
const fetchAndUpdatePoetry = (titleElement) => { const originalText = titleElement.innerText; if (titleElement.getAttribute('data-poetry-injected')) return; fetch('https://v1.jinrishici.com/all') .then(response => response.json()) .then(data => { titleElement.innerHTML = ''; const poetryContent = document.createElement('div'); poetryContent.textContent = data.content; poetryContent.style.fontSize = "1em"; poetryContent.style.lineHeight = "1.5"; titleElement.appendChild(poetryContent); if (data.author && data.origin) { const sourceInfo = document.createElement("div"); sourceInfo.textContent = `—— ${data.author}《${data.origin}》`; sourceInfo.style.fontSize = "0.8em"; sourceInfo.style.opacity = "0.8"; sourceInfo.style.marginTop = "8px"; sourceInfo.style.textAlign = "right"; titleElement.appendChild(sourceInfo); } titleElement.setAttribute('data-poetry-injected', 'true'); }) .catch(error => { console.error('获取今日诗词失败:', error); titleElement.textContent = originalText; }); }; const observeTodayCard = () => { const todayCard = document.getElementById("todayCard"); if (!todayCard) return; const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.attributeName === 'class') { if (!todayCard.classList.contains('hide')) { const titleElement = todayCard.querySelector('.todayCard-title'); if (titleElement) { titleElement.removeAttribute('data-poetry-injected'); fetchAndUpdatePoetry(titleElement); } } } }); }); observer.observe(todayCard, { attributes: true }); };
if (!checkAndUpdatePoetry()) { const bodyObserver = new MutationObserver((mutations, observer) => { if (checkAndUpdatePoetry()) { observer.disconnect(); } }); bodyObserver.observe(document.body, { childList: true, subtree: true }); setTimeout(() => { bodyObserver.disconnect(); }, 10000); } };
if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', injectTodayPoetry); } else { injectTodayPoetry(); } })();
|
如何使用这段代码:
-
作为独立JavaScript文件:
-
作为书签脚本:
-
创建一个新的浏览器书签
-
将书签的URL设置为:
1
| javascript:(function(){const s=document.createElement('script');s.textContent='这里粘贴上面的代码';document.body.appendChild(s);})();
|
-
每当你想激活这个功能时,点击这个书签
-
使用浏览器扩展:
- 如Chrome的Tampermonkey或Firefox的Greasemonkey
- 创建一个新脚本,粘贴上面的代码
- 设置脚本仅在你的网站上运行
代码的工作原理:
- 它以无侵入的方式查找并修改
.todayCard-title元素
- 使用
MutationObserver监听DOM变化,确保即使元素延迟加载也能被处理
- 当卡片从隐藏变为显示状态时,自动更新诗词内容
- 采用标记机制避免重复请求API
- 发生错误时会恢复原始内容,保证不会破坏页面显示
这种方法的优势是完全不修改原项目代码,并能适应各种情况,包括卡片隐藏/显示的状态变化。