You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ext JS 3.4图片src更新但显示旧图问题求助

解决Ext JS 3.4中BoxComponent图片显示旧缓存图的问题

我太懂你这种明明路径改了但图片死活不变的抓狂感了!其实这压根不是Ext JS 3.4的API问题,核心原因是浏览器缓存——它会把之前加载过的图片存在本地,哪怕你src路径看起来变了,只要URL本质上和之前的缓存键匹配,它就直接掏本地的旧图给你。下面给你几个亲测有效的解决办法:

方法一:给图片URL加缓存破击参数(最推荐)

浏览器是通过完整URL来缓存资源的,所以我们只要给每次的图片路径加个独一无二的后缀(比如时间戳、随机数),就能让浏览器认为这是个全新的资源,不会去读缓存。

如果是每次新建图片组件时用:

// 用当前时间戳当后缀,确保每次都不一样
var cacheBuster = '?' + new Date().getTime();
var image = new Ext.BoxComponent({ 
    autoEl: { 
        tag: 'img', 
        width: 90, 
        height: 250, 
        src: img_path + cacheBuster 
    } 
});

如果是窗口已经打开,要动态更新图片:

// 先拿到BoxComponent对应的DOM元素
var imgDom = image.getEl().dom;
// 给新路径加随机数后缀,然后替换src
imgDom.src = new_img_path + '?' + Math.random();

方法二:直接替换BoxComponent组件

因为Ext JS 3.4的BoxComponent确实没有专门的刷新视图方法,我们可以粗暴点——把旧的图片组件删掉,再重新加一个带新src的组件进去:

// 假设你的窗口实例是new_win,给图片组件加个itemId方便查找
var oldImage = new_win.getComponent('imageComp');
if (oldImage) {
    new_win.remove(oldImage, true); // true表示彻底销毁组件,释放资源
}
// 创建新的图片组件
var newImage = new Ext.BoxComponent({ 
    itemId: 'imageComp',
    autoEl: { 
        tag: 'img', 
        width: 90, 
        height: 250, 
        src: img_path 
    } 
});
new_win.add(newImage);
new_win.doLayout(); // 强制窗口重新布局,确保新组件正常显示

方法三:给图片添加禁用缓存的属性(辅助手段)

你可以在autoEl里加一些HTTP缓存控制的属性,不过这个兼容性不是100%,可以配合上面的方法一起用:

var image = new Ext.BoxComponent({ 
    autoEl: { 
        tag: 'img', 
        width: 90, 
        height: 250, 
        src: img_path,
        'http-equiv': 'Cache-Control',
        content: 'no-cache, no-store, must-revalidate'
    } 
});

总结一下,方法一最省心也最可靠,基本能解决90%以上的缓存问题;如果是复杂的动态场景,方法二也能完美适配。

内容的提问来源于stack exchange,提问作者Min Lee

火山引擎 最新活动