
本文介绍在使用 jQuery .load() 实现定时刷新 DOM 时,如何通过添加时间戳缓存参数(cache buster)强制绕过浏览器缓存,确保每次请求都能获取服务端最新生成的内容(如 Flask 动态生成的 PHP/HTML 片段)。
本文介绍在使用 jQuery `.load()` 实现定时刷新 DOM 时,如何通过添加时间戳缓存参数(cache buster)强制绕过浏览器缓存,确保每次请求都能获取服务端最新生成的内容(如 Flask 动态生成的 PHP/HTML 片段)。
在构建实时仪表盘(dashboard)时,常见做法是通过 JavaScript 定时发起 AJAX 请求,动态加载并替换页面中某一部分内容。然而,许多开发者会遇到这样一个典型问题:首次加载正常,但后续服务端文件(如 new-content.php)已更新,前端却始终显示旧内容——这并非后端未生效,而是浏览器主动缓存了 AJAX GET 请求的响应结果。
jQuery 的 .load() 方法底层使用的是 GET 请求,而现代浏览器对相同 URL 的 GET 请求默认启用强缓存策略(尤其当响应头未显式禁用缓存时)。即使服务端(如 Flask)已生成新内容,浏览器仍可能直接返回本地缓存副本,导致 DOM 无法反映真实更新。
解决方法是在请求 URL 后附加唯一、变化的查询参数,即“缓存粉碎器”(Cache Buster)。最常用且可靠的方式是使用当前时间戳:
function updateMain() {
setTimeout(function() {
console.log("updating");
const cacheBuster = new Date().getTime(); // 每次生成唯一毫秒级时间戳
$('#main').load('new-content.php?cb=' + cacheBuster + ' #main', function() {
updateMain(); // 递归调用,继续下一轮
});
}, 3000);
}
updateMain();✅ 关键说明:
- ?cb=1715234567890 这样的参数使每次请求 URL 均不相同,彻底规避浏览器缓存;
- #main 选择器仍保留在 URL 末尾(注意与查询参数用 & 分隔),确保仅加载目标片段;
- 若你使用的是较新版本 jQuery(≥3.0),建议改用更可控的 $.ajax() 封装,可显式设置 cache: false(它会自动添加 _= 时间戳):
function updateMain() {
setTimeout(function() {
$.ajax({
url: 'new-content.php',
type: 'GET',
cache: false, // ✅ jQuery 自动处理缓存问题
success: function(data) {
$('#main').html($(data).find('#main').html());
},
complete: updateMain // 无论成功失败,均继续下一轮(避免异常中断)
});
}, 3000);
}
updateMain();⚠️ 注意事项:
- 服务端(如 Flask)也应主动设置响应头 Cache-Control: no-cache, no-store, must-revalidate,从源头抑制代理或中间层缓存;
- 避免使用 setInterval 替代 setTimeout 递归调用——前者不等待上一次请求完成就触发下一次,易引发并发冲突或请求堆积;
- 生产环境建议增加错误处理(如网络失败时重试、显示加载状态、限制最大重试次数等),提升鲁棒性。
通过缓存参数或 cache: false 配置,即可确保每次 AJAX 请求都真实触达服务端,让仪表盘真正“活”起来。