我尝试从在Internet Explorer和Safari浏览器上绘制SVG图像的画布检索数据URL时遇到以下错误,而其他人正常工作。
此外,SVG图像包含一些<image>
元素,其xlink:href
属性设置为从用户文件系统读取的图像作为数据URL。由于这些图像不在不同的域上,因此在尝试获取绘制SVG图像的画布的dataURL时,我无法想到为什么会抛出此错误。提前谢谢。
SECURITY_ERR:DOM例外18:试图突破 用户代理的安全策略。“
答案 0 :(得分:4)
我可以使用我做的测试用例在Internet Explorer 11中确认此问题:
http://jsfiddle.net/tsbXW/
这是Microsoft正在处理的Internet Explorer的已知限制:
https://connect.microsoft.com/IE/feedback/details/828416/cavas-todataurl-method-doesnt-work-after-draw-svg-file-to-canvas
如错误报告所示,绘制到画布中的任何 SVG图像都会损坏画布,在调用toDataURL()时会导致SecurityError
。
对于它的价值,bug报告的test case在Safari 7.0.5中也不起作用(虽然据称Apple已在Safari 8中解决了这个问题)。此外,由于Bug 672013 - Allow SVG-as-an-image to be drawn into a canvas without marking it as write-only,测试用例在版本11之前在Firefox中不起作用。
答案 1 :(得分:1)
您的SVG似乎违反了安全政策,即使他们不应该这样做。
一个可能的解决方案是使用canvg,它解析SVG并直接渲染到画布。
如果你有SVG文本,canvg会添加drawSvg
方法,就像drawImage
一样。
样品:
var c = document.getElementById('canvas');
var ctx = c.getContext('2d');
ctx.drawSvg(SVG_XML_OR_PATH_TO_SVG, dx, dy, dw, dh);