在javascript中生成一些xml,提示用户保存它

时间:2010-02-09 01:37:46

标签: javascript save

我想在JavaScript中创建一个XML文档,然后出现一个保存对话框。

  1. 如果他们必须在保存之前点击,那就没关系。
  2. 如果我* *使用IE来实现这一点(我根本不需要支持它),这不是* OK。但是,Windows是必需的平台(因此,如果我只能在一个浏览器中执行此操作,则Firefox或Chrome是首选浏览器。)
  3. 如果我需要网络服务器,那就不行了。但相反,我不想要求JavaScript仅在本地文件上运行,即提升权限 - 如果可能的话。也就是说,我想在本地运行或在* static *主机上运行。但只是在当地就可以了。
  4. 向后弯腰可以做到这一点。该文件不会很大,但互联网访问可能在那里,不稳定或根本不可能 - 见(3)。
  5. 到目前为止,我所看到的唯一想法是将XML保存到iframe并保存该文档 - 但似乎您只能在IE中执行此操作?此外,我可以构建一个数据URI并将其放在一个链接中。我担心的是它只会在窗口中打开XML文件,而不是提示用户保存它。

    我知道如果我要求JavaScript是本地的,我可以提升权限并直接保存文件(或者希望导致出现保存对话框)。但是,我更喜欢一种不需要提升权限的解决方案(即使只支持Firefox 3.6)。

    如果这会冒犯任何人的敏感性(例如,不支持每个浏览器),我会道歉。我基本上想要编写一个离线应用程序,考虑到需求的复杂性和可用的时间,Javascript / HTML / CSS似乎是最佳候选者。但是,我有这个要求能够保存必须克服的数据才能选择这条开发线。

9 个答案:

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

为什么不在服务器端和服务器端服务器端使用混合闪存。大多数人都有闪存,因此您可以默认使用客户端来节省服务器上的资源。

相关问题