【问题标题】:Clear cache of specific image清除特定图像的缓存
【发布时间】:2015-10-06 03:36:09
【问题描述】:

我目前正在开发一个在线拍卖网站(抱歉,我无法在此处分享链接)。在产品列表上,我们的客户希望产品图像在从后端修改时实时动态更新。下面的解决方案可以解决问题:

var nocache = new Date().getTime();             
$('#auction_id_' + aucId + ' img#' + imgID).attr("src", 'ItemPics/t' + new_image_url + '?' + nocache);

但是当用户访问产品然后点击返回按钮回到产品列表页面时 - 产品图片的缓存没有被清除,旧的图片又回来了。

我无法禁用网站上的缓存,因为它会导致客户端加载过多。

(1) 我考虑过创建一个隐藏的 iframe,将图像作为 SRC,然后实时刷新。 (2) 简单地重新加载页面并不能解决问题,所以我还考虑过使用 JavasSript 操作 Ctrl + F5 以在用户单击后退按钮时强制请求新的图像数据 = 但我认为这些都不正确方法。

任何想法将不胜感激,谢谢!

【问题讨论】:

  • 您可能不得不想出一个异步解决方案,但很难说出您在寻找什么。您不希望用户在访问您的页面时查看的最后一张图片吗?你要第一个?我们没有看到这些图像是如何变化的。
  • @PHPglue 我希望将实时附加的新图像缓存起来,这样当用户单击后退按钮时,他们会看到新图像而不是旧图像
  • 你可以做一个函数来拉出随机图像。
  • @PHPglue 这也行不通,该网站以前的开发人员对其进行了编程,即使在后端更新时图像名称也保持不变。
  • After travelling back in Firefox history, javascript won't run 的可能重复项。所以解决方法是在window.onpageshow事件中绑定你的函数。

标签: javascript image browser-cache


【解决方案1】:

您的网络服务器中可能有一个配置,它使用Cache-Control: no-cache, max-age=0, must-revalidate, no-store 返回图像请求的 HTTP 标头,我相信这将迫使浏览器不将图像数据存储在缓存中。

查看 Firefox 中如何处理缓存控制标头:https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ

【讨论】:

  • 您好,感谢您的回答,但是“我无法禁用网站上的缓存,因为它会导致客户端加载过多。”我正在寻找一种方法来清除仅一个图像(不是所有图像)的缓存,然后用实时动态加载的更新图像替换它。
【解决方案2】:

您面临的问题不是图像被缓存,而是整个页面被缓存。
所以当你从历史中回来时,脚本没有被执行,图像仍然有相同的no-cache参数(see this answer for more info)。

解决此问题的一种解决方案是使用window.onpageshow 事件处理程序(带有lack of support for IE<11)或在window.onunload 事件处理程序中调用一个空函数。

if('onpageshow' in window){
  window.onpageshow = changeImgSrc;
}else {
  window.onload = changeImgSrc;
  window.onunload = function(){};
}

【讨论】:

    【解决方案3】:

    谢谢大家,我的同事已经可以解决问题了:

    在您的产品列表页面中,为您的图片添加唯一 ID:

    <img src = "images/img1.jpg" id = "image_<?php echo $imageID; ?>" />
    

    在您的后端,当单击更新图像按钮时,将新图像存储在会话变量中:

    session_start();
    $_SESSION['modified_item_images'][$ItemID] = $strNewPicName;
    

    然后在您的产品列表页面中,将更新后的图像数组存储到 JavaScript 变量中:

    var modified_item_images = <?php echo json_encode($_SESSION['modified_item_images']); ?>;
    

    然后循环遍历每个项目并在每个更新的图像链接的末尾添加一个时间戳:

    $(document).ready(function() {
    
    // Append updated images on back button click
    if(modified_item_images){
        $.each( modified_item_images, function( key, image_src ){
            var nocache = new Date().getTime(); 
            $('body').find('#image_' + key).attr('data-original', 'ItemPics/t' + image_src + '?' + nocache);
        });
    }
    

    所以当用户点击产品并点击浏览器的后退按钮时,我们将检查会话变量中是否存储了更新的图像,如果是,我们会重新附加它们并使用新的时间戳来防止浏览器从缓存中渲染旧图像。这仅适用于解决问题的动态修改的特定图像。

    【讨论】:

    • 我坦率地怀疑这个解决方案是否有效:按下后退按钮时,没有对服务器的新调用,它是从bfcache 提供的。 jQuery.ready() 也不会触发。 Alos,没有直接关系,但问题是关于 js 而不是关于 php。
    • @Kaiido 你忘了 PHP 脚本已经被返回按钮之前的页面运行了。它对我有用,我希望其他人也觉得它有用。
    • 但是如果用户在“下一页”页面上更新了图像,然后他又回到了“主”页面,那么他将看到的图像将不是更新后的图像。对 $_SESSION 的请求仅在加载时完成,而不是在 bfcached 时完成
    • @Kaiido 流程是这样的:: 1) 管理员用户在网站上更改商品图片,2) 用户通过产品列表导航看到图片在实时的帮助下动态变化(这也是设置会话的地方)。 3) 单个用户点击屏幕上动态变化的产品, 4) 从单个产品页面,用户点击返回按钮返回产品列表。 5) 脚本将读取在步骤 2 中设置的会话,并附加一个带有唯一 GET 参数的图像,以防止浏览器呈现图像的缓存版本。
    • 所以如果我明白了,你的问题是:让我们调用c 客户端,o 原始图像,u 更新后的图像,这要归功于无缓存解决方法。 c 来到index,下载o,然后更新为u。当c 转到page2,然后通过后退按钮返回index 时,他看到的是o 而不是u。那是对的吗?如果那时,您的问题不清楚并且这种行为不是正确的,因为&lt;img&gt;' src 应该是url+?no-cache 之一。无论如何,我给你的解决方案总是会重新执行无缓存的解决方法,并且应该在 6 行 js 中完成这项工作。
    猜你喜欢
    • 2013-08-16
    • 2013-06-23
    • 1970-01-01
    • 2012-02-05
    • 2011-02-22
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 2020-06-13
    相关资源
    最近更新 更多