我目前有一个使用D3的网站,我希望用户可以选择将SVG保存为SVG文件。我使用crowbar.js来做这件事,但它只能在chrome上工作。safari没有任何React,IE拒绝访问crowbar.js中使用的click()
方法来下载文件。
var e = document.createElement('script');
if (window.location.protocol === 'https:') {
e.setAttribute('src', 'https://raw.github.com/NYTimes/svg-crowbar/gh-pages/svg-crowbar.js');
} else {
e.setAttribute('src', 'http://nytimes.github.com/svg-crowbar/svg-crowbar.js');
}
e.setAttribute('class', 'svg-crowbar');
document.body.appendChild(e);
如何在Safari、IE和chrome中下载基于我网站上SVG元素的SVG文件?
9条答案
按热度按时间xcitsw881#
有5个步骤,我经常用这个方法输出内联svg。
1.获取要输出内联SVG元素。
1.通过XMLSerializer获取SVG源。
1.添加svg和xlink的命名空间。
1.利用encodeURIComponent方法构造svgurl数据模式。
1.将此url设置为某个“a”元素href属性,然后右键单击此链接以下载SVG文件。
vzgqcmou2#
我知道这个问题已经得到了解答,而且这个答案大部分时间都很好用。但是我发现它在Chrome上失败了(但不是Firefox)如果svg图像比较大如果您返回使用
Blob
结构,如here和here所述。唯一的区别是类型参数。在我的代码中,我希望通过单击一个按钮为用户下载svg,我使用以下代码实现了这一点:**2019年10月编辑:**评论指出,即使没有将
downloadLink
附加到document.body
,然后在click()
之后删除它,这段代码也可以工作。我相信这段代码曾经在Firefox上工作过,但现在不再工作了(Firefox要求你附加downloadLink
,然后删除它)。这段代码在Chrome上都可以工作。7gcisfzg3#
结合Dave和defghi1977的答案。下面是一个可重用函数:
调用示例:
6l7fqoea4#
要使此代码段正常工作,您需要FileSaver.js。
sulc1iza5#
我尝试了这里的所有解决方案,但没有一个对我有效。我的图片总是比我的d3.js画布小。
我必须设置画布
width
,height
,然后在context
上做一个clearRect
才能让它工作。导出功能:
它使用FileSaver.js来保存文件。
这是我的画布创建,注意我在这里解决了命名空间问题。
d3.js画布创建:
jmo0nnb36#
虽然这个问题已经得到了解答,但我创建了一个名为SaveSVG的小型库,它可以帮助保存D3.js生成的SVG,这些SVG使用外部样式表或外部定义文件(使用
<use>
和def
)标记。ha5z0ras7#
根据@vasyl-vaskivskyi的回答。
上面的代码读取chart.css,然后将css代码嵌入svg文件。
1bqhqjot8#
在我的场景中,我不得不在其他项目中使用一些用D3.js创建的svg图像。所以我打开dev工具,检查那些svg并复制它们的内容。然后创建一个新的空白svg文件,并将复制的内容粘贴到那里。然后我在其他区域使用这些新的svg文件。
如果你想以编程的方式完成它,那么我们可以使用document.getElementById('svgId ')
我知道这是一个基本的方法,但如果有人发现它有用。
dy1byipe9#
我试过了,效果很好
}