Chrome 不会在 SVG 中缓存图像
Chrome doesn't cache images inside SVG
我刚刚发现,如果放置在 SVG 中的图像的cache-control
标头设置为 no-cache
,Chrome 不会缓存放置在 SVG 中的图像。Firefox和IE10似乎忽略了此设置。
我创建了一个带有静态SVG的小测试页面:
.HTML:
<div style="width: 500px; text-align: center;">
<input id="move-left-btn" type="button" value="<<">
<input id="move-right-btn" type="button" value=">>">
</div>
<div class="svgwrapper" style="width: 500px; height: 250px; background-color: lightgrey;">
<svg id="svg" version="1.1" xmlns="http://www.w3.org/2000/svg" width="500" height="250">
<g id="svggroup" class="transition-on" transform="matrix(0.2,0,0,0.2,80,35)">
<image width="1672" height="887" opacity="1" xlink:href="https://dl.dropboxusercontent.com/sh/q7htlj5h8qqfhjf/SVDuynM7R3/car.png"></image>
</g>
</svg>
</div>
Javascript:
$(document).ready(function() {
var curXPos = 80;
// Local test function which represent some server calls in my "real life" scenario
// Just updates the x-position in the transform matrix in this test case
function updateSvgText(svgText, posXDelta) {
curXPos += posXDelta;
if (curXPos < 0) {
curXPos = 160;
} else if (curXPos > 160) {
curXPos = 0;
}
return svgText.replace(/matrix'(.*')/, 'matrix(0.2,0,0,0.2,' + curXPos + ',35)');
}
// Fetch the new SVG (in real life from server) and rerender it
function moveSvg(posXDelta) {
var svg = $('#svg'),
svgText = updateSvgText($('.svgwrapper').html(), posXDelta);
svg.empty();
svg.append($(svgText).children());
}
$('#move-left-btn').click($.proxy(moveSvg, this, -20));
$('#move-right-btn').click($.proxy(moveSvg, this, 20));
});
- 将
源图像的标题设置为
no-cache
cache-control
的工作示例(每次按下"移动"按钮后在 chrome 中闪烁):
http://jsfiddle.net/zF6NF/4/具有不同源图像的相同示例
cache-control
标头设置为max-age=315360000,public
(无闪烁):
http://jsfiddle.net/zF6NF/5/
单击按钮时重新加载图像(图像"闪烁"并在开发工具的网络选项卡中可见),而Firefox在两个示例中都流畅地重新渲染SVG,而无需任何重新加载。
一些附加信息:
这只是一个例子。在我的"现实生活场景"中,我从服务器收到一个新的 SVG(而不是
updateSvgText
方法调用),这意味着我不能通过更改转换矩阵属性的值来执行 SVG 的部分更新,而是必须每次重新渲染整个 SVG(至少现在......我无法控制图像的来源,这意味着两件事:
- 我无法更改
cache-control
标题
我无法创建 Base64 编码的数据 uri - ,将它们保存在本地,然后在渲染之前用这些数据 uri 替换 SVG 中的图像(由于"相同资源来源"策略,无法创建 Base64 编码的数据 uri...
- 我无法更改
有什么办法可以...
- 在本地覆盖/否决
cache-control
标头,即使图像来自不受控制的远程位置?
从 - 从其他域加载的图像创建 Base64 编码的数据 uri 我对客户端没有任何控制权?
- 以某种方式告诉 Chrome 始终在我的 SVG 中缓存图像?
不用说,其他解决方案也非常受欢迎!
谢谢
不幸的是,在缓存方面,99%是服务器的工作。
部门指南:这里
浏览器将始终根据某些条件查找文件的最新版本:
- 缓存的条目没有过期日期,并且内容是首次在浏览器会话中访问
- 缓存的条目具有到期日期,但已过期 缓存
- 控制/杂注告诉浏览器不要缓存
- 标头中的 Etag 是一种痛苦。
在解决方案方面,您拥有:
- 非常坚持你的服务器人员你需要缓存(删除 etag,缓存控制:公共,max-age = 31536000,编译指示:公共)
- 在您的域上创建一个代理,该代理需要来自站点的图像(可选转换为 base64),然后发送到您的客户端(使用正确的标头)。这是PHP的一个例子: 这里
相关文章:
- 使用脚本缓存图像
- 预加载图像和缓存图像之间有区别吗
- Chrome 不会在 SVG 中缓存图像
- 无法从画布缓存图像数据
- 如何在Javascript中缓存图像
- jQuery Datatable缓存图像问题
- 允许在页面上缓存,但请确保不缓存图像
- 强制浏览器仅缓存图像(而不是脚本和链接)
- 缓存图像&本地phonegap的数据
- 用javascript创建两次缓存图像
- 使用没有插件的angularjs缓存图像
- 使用Javascript加载和缓存图像,并了解HTTP状态码
- 如何使用Angularjs ionic缓存图像
- 在浏览器中缓存图像后,通过请求图像来检查互联网连接不起作用
- FileContentResult -防止浏览器缓存图像
- 使用骨干模型缓存图像
- 如何使用PhoneGap / Cordova本地缓存图像文件?
- 如何启用akamai缓存图像,css, js等
- Chrome/Firefox缓存图像问题
- Dropbox提供的浏览器缓存图像