关联主题::
同级:: 2025-08-30_星期六
下一级::
我来查看一下更新日志是如何实时获取数据的。让我先搜索相关的代码:
[2 tools called]
现在让我详细查看更新日志系统的实现:
[2 tools called]
让我再查看一下主页面中是如何调用更新日志的:
[1 tool called]
现在我完全理解了更新日志的实时数据获取机制。让我为您详细解释:
更新日志的实时数据获取机制
当前的更新日志系统通过以下方式实时获取数据:
1. 数据扫描机制
scanForUpdates() {
// 清空之前的数据
this.updateData = [];
const updateElements = document.querySelectorAll('.update-date');
updateElements.forEach(element => {
const updateDate = element.getAttribute('data-date');
const li = element.closest('li');
if (li && updateDate) {
const linkElement = li.querySelector('a');
const title = linkElement ? linkElement.textContent.trim() : '';
const url = linkElement ? linkElement.getAttribute('href') : '';
const path = this.getFullPath(li);
const notes = this.getNotes(li);
const backupUrl = this.getBackupUrl(li);
this.updateData.push({
title: title,
url: url,
updateDate: updateDate,
path: path,
notes: notes,
backupUrl: backupUrl,
timestamp: new Date(updateDate).getTime()
});
}
});
this.updateData.sort((a, b) => b.timestamp - a.timestamp);
// 更新全局变量
window.UPDATE_LOG_DATA = this.updateData;
console.log(`扫描到 ${this.updateData.length} 个更新项目`);
}
2. 实时性实现方式
A. DOM扫描方式:
- 系统在页面加载时自动扫描所有带有
update-date
类的DOM元素 - 实时从当前页面的HTML结构中提取数据,而不是从静态文件读取
- 每次打开更新日志时都会重新扫描最新的DOM状态
B. 数据获取流程:
// 尝试从父页面获取数据
if (window.opener && window.opener.UPDATE_LOG_DATA) {
updateData = window.opener.UPDATE_LOG_DATA;
originalData = [...updateData];
displayUpdateLog();
} else {
// 如果没有父页面数据,尝试从localStorage获取或显示错误
const storedData = localStorage.getItem('updateLogData');
if (storedData) {
try {
updateData = JSON.parse(storedData);
originalData = [...updateData];
displayUpdateLog();
} catch (e) {
showError('数据格式错误,请返回首页重新生成');
}
} else {
showError('无法获取更新日志数据,请返回首页重新生成');
}
}
3. 数据来源和结构
数据来源:
- 直接从首页的DOM元素中实时提取
- 查找所有带有
class="update-date"
和data-date
属性的元素 - 获取其父级
<li>
元素的完整信息
提取的数据包括:
- 标题: 链接文本内容
- URL: 链接地址
- 更新日期:
data-date
属性值 - 分类路径: 通过DOM树向上追溯获取完整路径
- 备注:
fa-info-circle
元素的notes
属性 - 备份链接: 带有
bei
类的图片链接
4. 触发方式
A. 手动触发:
function openUpdateLog() {
// 确保更新日志系统已经初始化
if (window.updateLogger && window.UPDATE_LOG_DATA) {
// 将数据存储到localStorage作为备用
localStorage.setItem('updateLogData', JSON.stringify(window.UPDATE_LOG_DATA));
// 打开更新日志页面
const updateLogWindow = window.open('update-log.html', '_blank');
// 如果弹出窗口被阻止,给用户提示
if (!updateLogWindow) {
alert('请允许弹出窗口以查看更新日志');
}
} else {
// 如果数据还没有准备好,等待一下再试
setTimeout(() => {
if (window.updateLogger && window.UPDATE_LOG_DATA) {
openUpdateLog();
} else {
alert('更新日志数据正在加载中,请稍后再试');
}
}, 1000);
}
}
B. URL参数触发:
- 访问
index.html?generateUpdateLog=true
会自动生成更新日志
5. 实时性保证
- 页面加载时初始化: 每次刷新首页都会重新扫描所有更新数据
- 点击时重新获取: 每次点击”更新日志”按钮都会获取最新的DOM数据
- 无缓存依赖: 不依赖静态文件或数据库,直接从当前页面状态获取
- 自动同步: 当你在首页添加、修改或删除带更新日期的资源时,更新日志会自动反映这些变化
6. 数据传递机制
- 主窗口到子窗口: 通过
window.opener.UPDATE_LOG_DATA
传递 - 本地存储备份: 同时存储到
localStorage
作为备用 - 全局变量: 在主窗口中维护
window.UPDATE_LOG_DATA
全局变量
这种设计确保了更新日志始终显示最新的数据状态,无需手动刷新或重新生成,实现了真正的”实时”数据获取。