Tôi vừa phát hiện thấy Chrome không lưu trữ hình ảnh được đặt bên trong SVG nếu tiêu đề cache-control
được đặt thành no-cache
. Firefox & IE10 dường như bỏ qua cài đặt này.Chrome không lưu hình ảnh trong SVG
tôi đã tạo ra một trang thử nghiệm nhỏ với một SVG tĩnh:
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));
});
dụ Làm việc với
cache-control
tiêu đề của hình ảnh nguồn đặt thànhno-cache
(nhấp nháy trong chrome sau mỗi lần nhấn vào nút "di chuyển") :
http://jsfiddle.net/zF6NF/4/Cùng ví dụ với hình ảnh nguồn khác nhau với
cache-control
tiêu đề thiết lập đểmax-age=315360000,public
(không nhấp nháy):
http://jsfiddle.net/zF6NF/5/
Trong Chrome bạn sẽ nhìn thấy tải lại các hình ảnh trên mỗi nút nhấp chuột trong ví dụ đầu tiên ("nhấp nháy" của hình ảnh & hiển thị trong tab mạng của các công cụ dev) trong khi Firefox hiển thị SVG trong cả hai ví dụ một cách trơn tru mà không cần tải lại.
Một số thông tin bổ sung:
Đây chỉ là một ví dụ. Trong "kịch bản thực tế" của tôi, tôi nhận được SVG mới từ máy chủ (thay vì gọi phương thức
updateSvgText
) có nghĩa là tôi không thể thực hiện cập nhật từng phần của SVG bằng cách thay đổi giá trị của thuộc tính ma trận biến đổi nhưng có để tái đầu tư toàn bộ SVG mỗi lần (ít nhất là bây giờ ...).tôi không thể kiểm soát nơi những hình ảnh xuất phát từ điều này có nghĩa 2 điều:
- tôi không thể thay đổi tiêu đề
cache-control
- tôi không thể tạo Base64 mã hóa dữ liệu URI, lưu chúng địa phương và chỉ cần thay thế những hình ảnh bên trong SVG với những dữ liệu URI trước khi render (không thể tạo Base64 mã hóa dữ liệu uri vì chính sách "Cùng nguồn gốc tài nguyên" ...)
- tôi không thể thay đổi tiêu đề
Có cách nào để một trong hai ...
- Overwrite/bác bỏ các
cache-control
tiêu đề tại địa phương ngay cả khi hình ảnh là từ một địa điểm từ xa không kiểm soát được? - Tạo dữ liệu mã hóa Base-uri từ một hình ảnh được tải từ một miền khác mà tôi không có quyền kiểm soát đối với phía máy khách?
- Bằng cách nào đó, hãy bảo Chrome luôn lưu vào bộ nhớ cache hình ảnh bên trong SVG của tôi?
Không cần phải nói rằng các giải pháp khác cũng rất được hoan nghênh!
Cảm ơn
nhận xét không liên quan - regexp có thể vượt quá nếu có dấu ngoặc đơn khác sau này trong văn bản. Vì vậy, nó phải là '/ matrix \ ([^)] * \)' hoặc một cái gì đó. –