是否有可能有一个按钮开始下载一个DOM元素?

问题描述:

我有一个在页面中生成的svg,我没有从外部源中引入它。我希望这个svg可以下载打印。有没有一种方法(使用客户端JavaScript)下载一个DOM节点作为文本文件?我仅限于此项目的dojo和d3库。是否有可能有一个按钮开始下载一个DOM元素?

+0

由于我没有足够的时间来完成我的答案,所以下面是更多信息的链接:[File API:Writer,FileSaver Interface](http://www.w3.org/TR/file- writer-api /#the-filesaver-interface),[这里的答案的示例代码](http://*.com/questions/7160720/create-a-file-using-javascript-in-chrome-on-client侧的/ 7160827#7160827)。请注意,所需的功能并未在所有浏览器(例如,不支持IE 10)中实施,因为它们仍然是草稿。另请参阅:[我可以使用:文件系统](http://caniuse.com/#feat=filesystem)。 – ComFreek

假设客户端正在使用HTML5网页浏览器,可以使用<a> s download attribute轻松实现此功能。如果您希望通过其他方式调用该行为,则需要在该元素上使用simulate a click并使用MouseEvent,但该节点不必附加到文档中。 I've answered a similar question about this before,但在这里,请将<a>设置为svg的文件位置,除非它是动态创建的 - 在这种情况下,您将编码描述它的文本以创建data URI

描述SVG的XML文本可以从SVGSVGElement节点使用XMLSerializer获得。

var serializer = new XMLSerializer(); 
serializer.serializeToString(svg); // xml string for `svg` (your node) 

请注意,任何“另存为”对话将取决于客户端的配置。

// assuming var `svg` for your SVG node 
var a = document.createElement('a'), xml, ev; 
a.download = 'my_svg.svg'; // file name 
xml = (new XMLSerializer()).serializeToString(svg); // convert node to xml string 
a.href = 'data:application/octet-stream;base64,' + btoa(xml); // create data uri 
// <a> constructed, simulate mouse click on it 
ev = document.createEvent("MouseEvents"); 
ev.initMouseEvent("click", true, false, self, 0, 0, 0, 0, 0, false, false, false, false, 0, null); 
a.dispatchEvent(ev); 
+0

我想让可下载的SVG不在文件中,它在浏览器中使用d3.js.生成。我没有外部文件可以引用,只是一个domNode。 – AdamSpurgin

+0

所以你想知道如何从SVGSVGElement获取描述它的字符串?现在编辑如何做到这一点。 –

+0

@AdamSpurgin也是,数据URI并不需要在base64中,因为XML是一个字符串,但是安全第一!更改MIME也应该没问题。我选择了_application/octet-stream_,因为即使浏览器不理解_download_属性(尽管通常以散列作为文件名),它也应该开始下载。 –