Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jQuery ajax和Chrome缓存问题?_Jquery_Ajax_Google Chrome_Caching_Cross Browser - Fatal编程技术网

jQuery ajax和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

我正在构建一个联系人表单,它通过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端添加头也不会有什么坏处。