如何修改现有jQuery Ajax请求禁用缓存?插件代码无法修改
解决jQuery插件Ajax缓存问题的稳定方案
为什么ajaxSetup无效?
如果插件在自身的Ajax请求中显式设置了cache: true,局部配置会覆盖ajaxSetup的全局设置,导致全局禁用缓存的规则失效。
可行的解决方案
方案1:使用ajaxPrefilter强制修改请求配置
ajaxPrefilter会在所有Ajax请求发送前拦截并修改配置,优先级高于局部和全局的默认设置,是最可靠的方式:
jQuery.ajaxPrefilter(function(options, originalOptions, jqXHR) { // 强制禁用缓存 options.cache = false; // 针对GET请求手动添加时间戳(进一步确保不被缓存) if (options.type?.toUpperCase() === 'GET') { const timestamp = new Date().getTime(); // 处理URL参数,避免重复添加时间戳 const separator = options.url.includes('?') ? '&' : '?'; options.url += `${separator}_=${timestamp}`; } });
优势:
- 拦截所有jQuery发起的Ajax请求(包括插件内部的请求)
- 直接覆盖请求的
cache配置,不受插件局部设置影响 - 手动添加时间戳彻底规避浏览器缓存逻辑,兼容性更强
方案2:通过ajaxSend事件修改请求
如果ajaxPrefilter无法满足需求,也可以利用ajaxSend事件在请求发送前修改配置:
jQuery(document).on('ajaxSend', function(event, jqXHR, options) { options.cache = false; // 同样为GET请求添加时间戳 if (options.type?.toUpperCase() === 'GET') { const ts = new Date().getTime(); options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + `_=${ts}`; } });
注意事项
- 确保这段代码在插件加载完成后、插件发起请求前执行,否则无法拦截插件的请求
- 若插件使用
$.get()、$.getJSON()等快捷方法,这些方法默认cache: true,上述方案依然能生效 - 时间戳参数名可以自定义(比如
_t),只要保证每次请求的URL唯一即可
内容的提问来源于stack exchange,提问作者user20507948
相关产品推荐
相关产品推荐

