SECURITY_ERR:DOM异常18在调用Canvas的toDataURL方法时

时间:2014-02-17 13:00:22

标签: javascript html5 internet-explorer safari mobile-safari

我尝试从在Internet Explorer和Safari浏览器上绘制SVG图像的画布检索数据URL时遇到以下错误,而其他人正常工作。

此外,SVG图像包含一些<image>元素,其xlink:href属性设置为从用户文件系统读取的图像作为数据URL。由于这些图像不在不同的域上,因此在尝试获取绘制SVG图像的画布的dataURL时,我无法想到为什么会抛出此错误。提前谢谢。

  

SECURITY_ERR:DOM例外18:试图突破   用户代理的安全策略。“

2 个答案:

答案 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);