Base64 SVG 无法在 Chrome 中呈现,在 Firefox 中有效
Base64 SVG Fails to render in Chrome, Works in Firefox
我正在尝试从页面上的 svg 创建图像。但是,我无法让 svgToImage()
函数在 google chrome 上运行。我将浏览器切换到 firefox,并且生成的所有内容都没有任何问题。 Firefox 似乎生成了 svg 的不同 base64 表示形式,当在 google chrome 中使用此版本时,它可以工作,但该函数仍然无法创建图像。
查看一些调试日志,firefox 似乎将 svg 元素从 <svg>
转换为 <a0:svg>
。这就是这段代码在 Firefox 中运行的原因吗?如果是这样,是否是由于 firefox 修复了不正确的名称空间而 chrome 忽略了?
我已经发布了我用来测试的片段。在 chrome 上,应该会看到两个背框,然后是一张损坏的图像。在 firefox 上,应该有三个黑框。
function svgToImage(target) {
// Works in firefox
// https://gist.github.com/Caged/4649511
var svg = document.getElementById(target);
var xml = new XMLSerializer().serializeToString(svg);
var data = 'data:image/svg+xml;base64,' + btoa(xml);
var image = new Image();
image.setAttribute('src', data);
document.body.appendChild(image);
}
//Generate another svg
svgToImage('aSVG');
<svg width="100" height="100" id="aSVG" xmlns="http://www,w3.org/2000/svg">
<rect id="someId" x="70" y="70" width="15" height="20" fill="#000" rx="5" ry="5" />
</svg>
<!-- generated from firefox -->
<img src="data:image/svg+xml;base64,PGEwOnN2ZyB4bWxuczphMD0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zPSJodHRwOi8vd3d3LHczLm9yZy8yMDAwL3N2ZyIgaWQ9ImFTVkciIGhlaWdodD0iMTAwIiB3aWR0aD0iMTAwIj4KCQkJPGEwOnJlY3Qgcnk9IjUiIHJ4PSI1IiBmaWxsPSIjMDAwIiBoZWlnaHQ9IjIwIiB3aWR0aD0iMTUiIHk9IjcwIiB4PSI3MCIgaWQ9InNvbWVJZCIvPgoJCTwvYTA6c3ZnPg==" ></img>
它失败了,因为你的 xmlns 属性中有一个逗号而不是一个点。
在 HTML 中内联嵌入 SVG 时,不需要 xmlns,因此可以将其删除。
function svgToImage(target) {
// Works in firefox
// https://gist.github.com/Caged/4649511
var svg = document.getElementById(target);
var xml = new XMLSerializer().serializeToString(svg);
var data = 'data:image/svg+xml;base64,' + btoa(xml);
var image = new Image();
image.setAttribute('src', data);
document.body.appendChild(image);
}
//Generate another svg
svgToImage('aSVG');
<svg width="100" height="100" id="aSVG">
<rect id="someId" x="70" y="70" width="15" height="20" fill="#000" rx="5" ry="5" />
</svg>
<!-- generated from firefox -->
<img src="data:image/svg+xml;base64,PGEwOnN2ZyB4bWxuczphMD0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zPSJodHRwOi8vd3d3LHczLm9yZy8yMDAwL3N2ZyIgaWQ9ImFTVkciIGhlaWdodD0iMTAwIiB3aWR0aD0iMTAwIj4KCQkJPGEwOnJlY3Qgcnk9IjUiIHJ4PSI1IiBmaWxsPSIjMDAwIiBoZWlnaHQ9IjIwIiB3aWR0aD0iMTUiIHk9IjcwIiB4PSI3MCIgaWQ9InNvbWVJZCIvPgoJCTwvYTA6c3ZnPg==" ></img>
我正在尝试从页面上的 svg 创建图像。但是,我无法让 svgToImage()
函数在 google chrome 上运行。我将浏览器切换到 firefox,并且生成的所有内容都没有任何问题。 Firefox 似乎生成了 svg 的不同 base64 表示形式,当在 google chrome 中使用此版本时,它可以工作,但该函数仍然无法创建图像。
查看一些调试日志,firefox 似乎将 svg 元素从 <svg>
转换为 <a0:svg>
。这就是这段代码在 Firefox 中运行的原因吗?如果是这样,是否是由于 firefox 修复了不正确的名称空间而 chrome 忽略了?
我已经发布了我用来测试的片段。在 chrome 上,应该会看到两个背框,然后是一张损坏的图像。在 firefox 上,应该有三个黑框。
function svgToImage(target) {
// Works in firefox
// https://gist.github.com/Caged/4649511
var svg = document.getElementById(target);
var xml = new XMLSerializer().serializeToString(svg);
var data = 'data:image/svg+xml;base64,' + btoa(xml);
var image = new Image();
image.setAttribute('src', data);
document.body.appendChild(image);
}
//Generate another svg
svgToImage('aSVG');
<svg width="100" height="100" id="aSVG" xmlns="http://www,w3.org/2000/svg">
<rect id="someId" x="70" y="70" width="15" height="20" fill="#000" rx="5" ry="5" />
</svg>
<!-- generated from firefox -->
<img src="data:image/svg+xml;base64,PGEwOnN2ZyB4bWxuczphMD0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zPSJodHRwOi8vd3d3LHczLm9yZy8yMDAwL3N2ZyIgaWQ9ImFTVkciIGhlaWdodD0iMTAwIiB3aWR0aD0iMTAwIj4KCQkJPGEwOnJlY3Qgcnk9IjUiIHJ4PSI1IiBmaWxsPSIjMDAwIiBoZWlnaHQ9IjIwIiB3aWR0aD0iMTUiIHk9IjcwIiB4PSI3MCIgaWQ9InNvbWVJZCIvPgoJCTwvYTA6c3ZnPg==" ></img>
它失败了,因为你的 xmlns 属性中有一个逗号而不是一个点。
在 HTML 中内联嵌入 SVG 时,不需要 xmlns,因此可以将其删除。
function svgToImage(target) {
// Works in firefox
// https://gist.github.com/Caged/4649511
var svg = document.getElementById(target);
var xml = new XMLSerializer().serializeToString(svg);
var data = 'data:image/svg+xml;base64,' + btoa(xml);
var image = new Image();
image.setAttribute('src', data);
document.body.appendChild(image);
}
//Generate another svg
svgToImage('aSVG');
<svg width="100" height="100" id="aSVG">
<rect id="someId" x="70" y="70" width="15" height="20" fill="#000" rx="5" ry="5" />
</svg>
<!-- generated from firefox -->
<img src="data:image/svg+xml;base64,PGEwOnN2ZyB4bWxuczphMD0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zPSJodHRwOi8vd3d3LHczLm9yZy8yMDAwL3N2ZyIgaWQ9ImFTVkciIGhlaWdodD0iMTAwIiB3aWR0aD0iMTAwIj4KCQkJPGEwOnJlY3Qgcnk9IjUiIHJ4PSI1IiBmaWxsPSIjMDAwIiBoZWlnaHQ9IjIwIiB3aWR0aD0iMTUiIHk9IjcwIiB4PSI3MCIgaWQ9InNvbWVJZCIvPgoJCTwvYTA6c3ZnPg==" ></img>