清除特定图像的缓存
Clear cache of specific image
我目前正在一个在线拍卖网站上工作(很抱歉,我不能在这里分享 link)。在产品列表中,我们的客户希望从后端修改产品图像时能够实时动态更新。下面的解决方案可以解决问题:
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 以在用户单击后退按钮时强制请求新图像数据 = 但我认为这些都不正确方法。
任何想法将不胜感激,谢谢!
您可能在您的网络服务器中配置了 returns HTTP header 用于使用 Cache-Control: no-cache, max-age=0, must-revalidate, no-store
的图像请求,这将强制浏览器不将图像数据存储在缓存 i相信。
查看 cache-control headers 在 firefox 中的处理方式:https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ
您面临的问题不是图像被缓存,而是整个页面被缓存。
因此,当您从历史记录中返回时,脚本不会执行并且图像仍然具有相同的 no-cache
参数 (see this answer for more info).
解决此问题的一个解决方案是使用 window.onpageshow event handler (with a lack of support for IE<11 ) 或在 window.onunload
事件处理程序中调用一个空函数。
if('onpageshow' in window){
window.onpageshow = changeImgSrc;
}else {
window.onload = changeImgSrc;
window.onunload = function(){};
}
谢谢大家,我的同事已经能够解决问题了:
在您的产品列表页面中,为您的图片添加唯一 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']); ?>;
然后遍历每个项目并在每个更新图像的末尾添加时间戳 link:
$(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);
});
}
因此,当用户点击产品并点击浏览器的“后退”按钮时,我们将检查会话变量中是否存储了更新的图像,如果是,我们将重新附加一个新的时间戳防止浏览器从缓存中渲染旧图像。这将仅适用于解决问题的动态修改的特定图像。
我目前正在一个在线拍卖网站上工作(很抱歉,我不能在这里分享 link)。在产品列表中,我们的客户希望从后端修改产品图像时能够实时动态更新。下面的解决方案可以解决问题:
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 以在用户单击后退按钮时强制请求新图像数据 = 但我认为这些都不正确方法。
任何想法将不胜感激,谢谢!
您可能在您的网络服务器中配置了 returns HTTP header 用于使用 Cache-Control: no-cache, max-age=0, must-revalidate, no-store
的图像请求,这将强制浏览器不将图像数据存储在缓存 i相信。
查看 cache-control headers 在 firefox 中的处理方式:https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ
您面临的问题不是图像被缓存,而是整个页面被缓存。
因此,当您从历史记录中返回时,脚本不会执行并且图像仍然具有相同的 no-cache
参数 (see this answer for more info).
解决此问题的一个解决方案是使用 window.onpageshow event handler (with a lack of support for IE<11 ) 或在 window.onunload
事件处理程序中调用一个空函数。
if('onpageshow' in window){
window.onpageshow = changeImgSrc;
}else {
window.onload = changeImgSrc;
window.onunload = function(){};
}
谢谢大家,我的同事已经能够解决问题了:
在您的产品列表页面中,为您的图片添加唯一 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']); ?>;
然后遍历每个项目并在每个更新图像的末尾添加时间戳 link:
$(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);
});
}
因此,当用户点击产品并点击浏览器的“后退”按钮时,我们将检查会话变量中是否存储了更新的图像,如果是,我们将重新附加一个新的时间戳防止浏览器从缓存中渲染旧图像。这将仅适用于解决问题的动态修改的特定图像。