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




