IE浏览器缓存和jQuery表单插件

时间:2010-02-22 19:43:39

标签: ajax jquery

就像我面前失去的灵魂一样,我正在陷入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调用的话,请插入它们?

4 个答案:

答案 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 });
});