jQuery ajax和Chrome缓存问题?
我正在构建一个联系人表单,它通过jQuery使用ajax获取一个CAPTCHA图像和一个隐藏的数据字段,并在DOM就绪后将其放入表单中。此外,单击验证码图像时,它会重新加载图像和隐藏数据字段 CAPTCHA图像创建脚本是我自己创建的,我已经使用了几年-它非常健壮,工作正常,但是这是我第一次尝试通过ajax将其集成到网站 粗略地说,我得到了以下jQuery。我觉得支持HTML/CSS/PHP是相当无关紧要的-我可以提供一些,如果必要的话,但一切似乎都很好。。。问题似乎出在jQuery或Chrome浏览器缓存上jQuery ajax和Chrome缓存问题?,jquery,ajax,google-chrome,caching,cross-browser,Jquery,Ajax,Google Chrome,Caching,Cross Browser,我正在构建一个联系人表单,它通过jQuery使用ajax获取一个CAPTCHA图像和一个隐藏的数据字段,并在DOM就绪后将其放入表单中。此外,单击验证码图像时,它会重新加载图像和隐藏数据字段 CAPTCHA图像创建脚本是我自己创建的,我已经使用了几年-它非常健壮,工作正常,但是这是我第一次尝试通过ajax将其集成到网站 粗略地说,我得到了以下jQuery。我觉得支持HTML/CSS/PHP是相当无关紧要的-我可以提供一些,如果必要的话,但一切似乎都很好。。。问题似乎出在jQuery或Chrome
$(document).ready(function() {
commentFormCaptchaWrapper = $('#captchawrapper');
// Check DOM for CAPTCHA wrapper... if it's there get the CAPTCHA image
if (commentFormCaptchaWrapper.length > 0) {getCaptchaImage()}
// If the CAPTCHA image is clicked get a new one
commentFormCaptchaWrapper.click(getCaptchaImage);
});
function getCaptchaImage(){
commentFormCaptchaWrapper.html();
$.ajax({
url: '/captcha/ajax.captcha.php',
type: 'post',
cache: false,
success: function(response){
commentFormCaptchaWrapper.html(response);
},
error: function(response){
alert ("Ajax Error");
}
});
}
在Firefox、Opera和IE中,一切都能正常工作,但在Chrome中却无法正常工作。在Chrome中,对CAPTCHA图像和隐藏字段的初始ajax调用工作正常,但是当您单击CAPTCHA时,Captchawrapper div被清空时会出现短暂的闪烁,因此检测到单击OK,但它会重新加载相同的图像
为了简单地解释我的验证码脚本,它通常会基于一些文本生成一个图像,并对内容进行加密,以用作带有时间戳后缀的文件名,然后使用唯一的名称缓存图像。因此,每次使用CAPTCHA脚本时,它都会提供一个完全唯一的不同文件名
我还没有完全跟上jQuery的速度,但是据我所知,我已经关闭了jQuery中的ajax缓存,所以我不知道出了什么问题。。。有人能帮忙吗?基于我上面的评论,这里可能有两个级别的缓存,请求和响应。在$.ajax调用中使用cache:false应该足以防止在浏览器中进行请求缓存 但是,在服务器级别,必须为浏览器设置适当的响应头,以便正确解释如何缓存响应。对于PHP,一组典型的“请勿缓存”!标题至少可能如下所示:
$ts = gmdate("D, d M Y H:i:s") . " GMT";
header("Expires: $ts");
header("Last-Modified: $ts");
header("Pragma: no-cache");
header("Cache-Control: no-cache, must-revalidate");
OTOH,在Bondye发布的链接上的回答中,还有另一个修正:
$.ajax({
url: '/captcha/ajax.captcha.php',
type: 'post',
data: '', // <-- Add this!
cache: false,
success: function(response){
commentFormCaptchaWrapper.html(response);
},
error: function(response){
alert ("Ajax Error");
}
});
尝试在$.ajax调用中添加数据:,行。您还可以进一步检查错误回调中的数据,以查看是否有奇怪的错误代码返回。是否可以从ajax.captcha.php发布任何代码?在发送响应之前,您可以查看哪些与缓存相关的头,哪些与缓存相关,哪些不相关。是否重复@邦迪-我不相信这是复制品。我以前读过这篇文章,在这个例子中,ajax调用失败了。在这个例子中,它工作得很好——当我不想缓存时,它似乎正在缓存。&@Bondye——谢谢:添加数据:,这个技巧做得很好,尽管我真的不明白为什么。我显然需要进一步调查。另外,您认为我应该将php头添加到服务器端脚本中吗?即使每次调用脚本时都返回一个具有不同文件名的图像,您也可以在数据中添加一个时间戳。这样,您的请求每次都不同,不会被缓存。我也不知道为什么会这样。@Cory-谢谢你的建议。对不起,我在之前的评论中确实感谢你,但是你的名字好像掉到了什么地方@Galway:Adding cache:false在$.ajax属性中强制jQuery自动向请求URL追加时间戳;也不需要手动执行。@道格:文件名保证是唯一的吗?如果多个用户在同一微秒的时间内请求验证码图像,时间戳后缀是否足够细粒度,以确保行为正确?我可能会考虑用一个GUID或一些比时间戳更随机的命名文件。另外,在PHP端添加头也不会有什么坏处。