通过代码说明Hubert OG的答案; 首先有两点需要注意。
首先(感谢Robert Longson),它可能在没有encodeURIComponent的情况下工作,但最好包括它(例如,如果您有像fill="url(#pattern)"
这样的东西,由于#字符,需要encodeURIComponent)
其次,SVG命名空间是不可选的,但它可能不包含在svgElt.outerHTML
中。特别是,如果您通过createElementNS
创建了您的svg节点,就像这样
svgElt = document.createElementNS("http://www.w3.org/2000/svg", 'svg')
然后对svgElt.outerHTML
的后续调用将不会包含命名空间属性,这将导致代码无法正常工作,除非您稍后以某种方式包含命名空间属性。
var imgEnc = new Image();
var imgEncNS = new Image();
var prefix = 'data:image/svg+xml,';
var svgOpen = '<svg width="200" height="30">';
var svgClose = '</svg>';
var svgOpenNS = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="30">';
var rect = '<rect width="200" height="30" fill="black"/>';
var html = svgOpen + rect + svgClose;
var htmlNS = svgOpenNS + rect + svgClose;
var htmlEnc = window.encodeURIComponent(html);
var htmlEncNS = window.encodeURIComponent(htmlNS);
imgEnc.src = prefix + htmlEnc;
imgEncNS.src = prefix + htmlEncNS;
function T(txt){
document.body.appendChild(document.createTextNode(txt));
}
function HR(){ document.body.appendChild(document.createElement('hr')); }
function BR(){ document.body.appendChild(document.createElement('br')); }
function A(arg){ document.body.appendChild(arg); }
T('without namespace'); BR(); A(imgEnc); HR();
T('with namespace'); BR(); A(imgEncNS);
你可以通过使用我在这个问题中回答的outerXHTML
函数来解决缺少命名空间的问题。
或者像这样
function imgFromSVGnode(node){
function setNS(elt, parentNS){
var namespace = elt.namespaceURI;
if (namespace!==parentNS){
elt.setAttribute('xmlns', namespace);
}
for (var i=0; i<elt.childNodes.length; i++){
setNS(elt.childNodes[i], namespace);
}
}
setNS(node, null);
var html = node.outerHTML;
var dataURL = 'data:image/svg+xml,' + window.encodeURIComponent(html);
var img = new Image();
img.src = dataURL;
return img;
};
toDataURL
或者getImageData
,因为画布不再是“origin-clean”的。 - Matthew Crumleyimg.src = "data:image/svg+xml;base64,..."
,但也没有起作用。 - Drew LeSueurdrawImage
上。对我来说,drawImage
是可以工作的。问题是在我绘制完图像后toDataURL
或getImageData
无法工作。 - Drew LeSueur