如何防止 AJAX 请求因浏览器缓存导致动态内容无法实时更新

本文介绍在使用 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();

关键说明

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();

⚠️ 注意事项

通过缓存参数或 cache: false 配置,即可确保每次 AJAX 请求都真实触达服务端,让仪表盘真正“活”起来。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。