Sea*_*ean 6 javascript ajax file-io
应用程序通过 AJAX 从服务器请求 KML 数据。该数据存储在 JavaScript 变量中,并显示在 Google 地球插件中。
在 javascript 中,如何提供链接来下载存储在 javascript 变量(作为字符串)中的 KML 数据,而不需要向服务器发出请求?
此链接: http: //forum.mootools.net/viewtopic.php?id =9728
建议使用数据 URI,但这可能无法在足够多的浏览器上满足我的需求。可能最简单的只是返回服务器再次获取数据以供下载,但很好奇是否有人用 JavaScript 实现了这一点。
小智 6
这会起作用的!这个对我有用。
`function download(filename, text) {
var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
// Start file download.
download('hello.txt','This is the content of my file ');
`Run Code Online (Sandbox Code Playgroud)
简短的回答:你不能而且仍然是平台独立的。大多数浏览器不允许 javascript 操作文件系统。
也就是说,您可能能够摆脱一些特定于平台的黑客攻击。例如,IE 提供了 execCommand 函数,您可以使用它来调用 SaveAs。如果您在包含要保存的数据的 IFrame 中执行此操作,则可能会使其正常工作 - 但仅限于 IE。其他选项(同样,我在这里针对的是 Microsoft)包括Silverlight hack或 ActiveX 控件。
我认为为了实现完整的平台兼容性,您只需要忍受它并提供服务器端下载选项。
[编辑] 哎呀!当我去寻找链接时,我没有做足够的尽职调查。事实证明,我链接到的 Silverlight hack 有一个服务器端组件。看来你很 SOL。
[Edit2] 我在这里找到了关于 execCommand 的浏览器兼容性的很好的总结。尽管它列出了“saveas”命令的问号,但也许这对您来说可能是一条好路线。也许值得一试?
[Edit3] 嗯,我决定对我建议的方法进行概念验证,并且我在 IE 中得到了相当简单的结果。不幸的是,我在这个过程中证明了这种方法不适用于 Firefox,而且似乎也不适用于 Chrome/Safari。所以它非常依赖于平台。但它有效!这是一个完整的工作页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Javascript File Saver</title>
<script type="text/javascript">
function PageLoad() {
var fdoc = window.frames["Frame"].document;
fdoc.body.appendChild(fdoc.createTextNode("foo,bar,baz"));
}
function Save() {
var fdoc = window.frames["Frame"].document;
fdoc.execCommand("SaveAs", true);
}
</script>
</head>
<body onload="PageLoad();">
<h2>Javascript File Saver</h2>
<iframe id="Frame" style="width: 400px;">Noframe</iframe><br />
<button onclick="Save();">Save</button>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)