就像我面前失去的灵魂一样,我正在陷入Ajax表格提交和IE浏览器缓存的蛇坑中挣扎。
我正在尝试使用jQuery Form Plugin编写一个简单的脚本来Ajaxify Wordpress注释。它在Firefox,Chrome,Safari等中运行良好。但是,在IE中,响应文本被缓存,结果是Ajax引入了错误的注释。
jQuery(this).ajaxSubmit({
success:
function(data) {
var response = $("<ol>"+data+"</ol>");
response.find('.commentlist li:last').hide().appendTo(jQuery('.commentlist')).slideDown('slow');
}
});
ajaxSubmit将评论发送到wp-comments-post.php,它将整个页面作为回应非常优秀地回吐。因此,尽管它像蟾蜍一样丑陋,但我将响应文本粘贴在一个变量中,使用:last来隔离最新的注释,并将其向下滑动。
但是,IE正在返回页面的缓存版本,该版本不包含新注释。所以“.commentlist li:last”选择上一个评论,其中一个副本然后无用地滑下原始评论。我已尝试在ajaxSubmit选项中设置“cache:false”,但它没有任何效果。我已经尝试设置一个url选项并添加一个随机数或时间戳,但它最终会附加到POST,它将注释提交给服务器而不是返回响应的GET,因此没有任何效果。我不知道还有什么可以尝试的。如果我关闭浏览器缓存,IE中的一切工作正常,但这显然不是我期望任何人查看页面的事情。
任何帮助都将非常感激。提前致谢!
使用进度报告编辑:有几个人建议使用PHP标头来阻止缓存,这确实有效。麻烦的是wp-comments-post在提交新评论时吐出整个页面,我可以看到添加标题的唯一方法是将它们放入Wordpress帖子模板中,这会禁用所有帖子上的缓存时代 - 不是我正在寻找的行为。
有没有办法设置一个php条件 - “if is_ajax”或类似的东西 - 这将使标头在常规页面加载期间不被应用,但如果页面是由Ajax GET调用的话,请插入它们?
答案 0 :(得分:2)
jQuery.ajaxSubmit()采用标准 jQuery.ajax()的任何选项。因此,您可以使用标准的 cache:false 选项来关闭缓存:
jQuery(this).ajaxSubmit({
cache: false,
success:
function(data) {
var response = $("<ol>"+data+"</ol>");
response.find('.commentlist li:last').hide().appendTo(jQuery('.commentlist')).slideDown('slow');
}
});
答案 1 :(得分:1)
我这样做的方法是在末尾添加一个rand = new Date()。getTime()
if(url.replace("?") != url)
url = url+"&rand="+new Date().getTime();
else
url = url+"?rand="+new Date().getTime();
上面的函数会将rand = time附加到url的地址[.php的地址]如果你提供了get参数,它会添加&amp; rand = time ...否则会添加?rand =时间 浏览器保持缓存,但页面不会重叠。
你也可以使用PHP的header()通过设置Cache-control:和Expires来禁用缓存:
答案 2 :(得分:0)
把它放在你的php的开头:
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
这应该有所帮助。如果没有 - 尝试将随机数作为带有标题的文件名。
该帖子被重定向到获取请求,您必须向get页面发送一些信息以控制是否应该缓存它。
答案 3 :(得分:0)
这将阻止全局缓存
$(document).ready(function() {
$.ajaxSetup({ cache: false });
});