我想在JavaScript中创建一个XML文档,然后出现一个保存对话框。
到目前为止,我所看到的唯一想法是将XML保存到iframe并保存该文档 - 但似乎您只能在IE中执行此操作?此外,我可以构建一个数据URI并将其放在一个链接中。我担心的是它只会在窗口中打开XML文件,而不是提示用户保存它。
我知道如果我要求JavaScript是本地的,我可以提升权限并直接保存文件(或者希望导致出现保存对话框)。但是,我更喜欢一种不需要提升权限的解决方案(即使只支持Firefox 3.6)。
如果这会冒犯任何人的敏感性(例如,不支持每个浏览器),我会道歉。我基本上想要编写一个离线应用程序,考虑到需求的复杂性和可用的时间,Javascript / HTML / CSS似乎是最佳候选者。但是,我有这个要求能够保存必须克服的数据才能选择这条开发线。
答案 0 :(得分:6)
这个downloadify脚本怎么样?
这是基于Flash和jQuery的,它可以提示您在计算机中保存文件的对话框。
Downloadify.create('downloadify',{
filename: function(){
return document.getElementById('filename').value;
},
data: function(){
return document.getElementById('data').value;
},
onComplete: function(){
alert('Your File Has Been Saved!');
},
onCancel: function(){
alert('You have cancelled the saving of this file.');
},
onError: function(){
alert('You must put something in the File Contents or there will be nothing to save!');
},
swf: 'media/downloadify.swf',
downloadImage: 'images/download.png',
width: 100,
height: 30,
transparent: true,
append: false
});
答案 1 :(得分:4)
使用base64编码的数据URI,只有html& JS。您可以做的是使用像jquery-base64 by carlo这样的js库将要保存的数据(在您的情况下,一串XML数据)编码到base64中。然后将编码的字符串放入链接,并将链接添加到DOM。
使用我提到的库(以及jquery)的示例:
<html>
<head>
<title>Example</title>
</head>
<body>
<script>
//include jquery and jquery-base64 here (or whatever library you want to use)
document.write('<a href="data:application/octet-stream;base64;charset=utf-8,' + $.base64.encode( "this is a example, which requires the jquery-base64 library to work... replace this text with your xml" ) + '">click to make save dialog</a>');
</script>
</body>
</html>
...并且请记住将内容类型设置为application/octet-stream
,以便浏览器不会尝试打开它。
警告:一些较旧的IE版本不支持base64,但你说没关系,所以这对你来说应该没问题。
答案 2 :(得分:2)
如果不再了解您的具体要求,我建议您不要使用纯粹的Javascript / HTML解决方案。从用户的角度来看,您可能会在编写本机应用程序时获得最佳结果。但是,如果使用Javascript / HTML会更快,我建议使用托管轻量级Web服务器的本地应用程序来提供您的内容。这样,您可以干净地处理文件保存服务器端,同时将大部分精力集中在前端应用程序上。
您可以使用非常少的代码行和没有第三方库来编写Web服务器 - 例如 - Python或Ruby。例如,请参阅:
"""
Serves files out of its current directory.
Doesn't handle POST requests.
"""
import SocketServer
import SimpleHTTPServer
PORT = 8080
def move():
""" sample function to be called via a URL"""
return 'hi'
class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_GET(self):
#Sample values in self for URL: http://localhost:8080/jsxmlrpc-0.3/
#self.path '/jsxmlrpc-0.3/'
#self.raw_requestline 'GET /jsxmlrpc-0.3/ HTTP/1.1rn'
#self.client_address ('127.0.0.1', 3727)
if self.path=='/move':
#This URL will trigger our sample function and send what it returns back to the browser
self.send_response(200)
self.send_header('Content-type','text/html')
self.end_headers()
self.wfile.write(move()) #call sample function here
return
else:
#serve files, and directory listings by following self.path from
#current working directory
SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
httpd = SocketServer.ThreadingTCPServer(('localhost', PORT),CustomHandler)
print "serving at port", PORT
httpd.serve_forever()
最后 - 根据谁将使用您的应用程序,您还可以选择将Python程序编译为Frozen Binary,以便最终用户不必在其计算机上安装Python。
答案 3 :(得分:1)
不允许Javascript写入本地计算机。您的问题类似于this one。
我建议您创建一个简单的桌面应用。
答案 4 :(得分:0)
您是否在寻找this之类的内容?
如果PHP没问题,那就更容易了。
答案 5 :(得分:0)
localhost PHP服务器可以吗?由于安全问题,Web传统上无法保存到硬盘驱动器。虽然PHP需要服务器,但它可以推送文件。
适用于所有浏览器的打印到PDF插件。安装一次,永久打印到PDF。然后,您可以使用javascript或Flash调用打印功能。
此外,如果您正在开发一个互联网访问不稳定的环境,请使用VB.NET或其他桌面语言。
编辑:
您可以使用浏览器的打印功能。
答案 6 :(得分:0)
使用IE,您可以使用document.execCommand,但我注意到IE不是一个选项。
虽然它不会通过SaveAs对话框https://developer.mozilla.org/en/Code_snippets/File_I%2F%2FOL提示,但它看起来可能有所帮助。
答案 7 :(得分:0)
执行此操作但不需要任何Flash的一种简单但奇怪的方法是为<a/>
创建一个href
data URI。这甚至具有相当好的跨浏览器支持,但是对于IE,它必须至少是版本8并且URI必须是&lt; 32K。关于该主题,它看起来像SO has more to say上的其他人。
答案 8 :(得分:0)
为什么不在服务器端和服务器端服务器端使用混合闪存。大多数人都有闪存,因此您可以默认使用客户端来节省服务器上的资源。