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

在javascript中生成一些xml,提示用户保存,javascript,save,Javascript,Save,我想用JavaScript制作一个XML文档,然后显示一个保存对话框 如果必须单击才能进行保存,则可以 如果我必须使用IE来实现这一点(我甚至根本不需要支持它),那就不好了。但是,Windows是一个必需的平台(因此,如果我只能在一个浏览器中执行此操作,那么Firefox或Chrome是首选浏览器) 如果我需要一个网络服务器,这是不好的。但反过来说,我不想要求JavaScript只在本地文件上运行,即提升权限——如果可能的话。也就是说,我希望在本地或*静态*主机上运行。但只要在本地就可以了 做这

我想用JavaScript制作一个XML文档,然后显示一个保存对话框

  • 如果必须单击才能进行保存,则可以
  • 如果我必须使用IE来实现这一点(我甚至根本不需要支持它),那就不好了。但是,Windows是一个必需的平台(因此,如果我只能在一个浏览器中执行此操作,那么Firefox或Chrome是首选浏览器)
  • 如果我需要一个网络服务器,这是不好的。但反过来说,我不想要求JavaScript只在本地文件上运行,即提升权限——如果可能的话。也就是说,我希望在本地或*静态*主机上运行。但只要在本地就可以了
  • 做这件事必须向后弯腰是可以的。该文件不会很大,但可以访问internet,也可以是不完整的,或者根本不可能访问--参见(3)
  • 到目前为止,我看到的唯一想法是将XML保存到iframe并保存该文档——但似乎您只能在IE中完成这项工作?此外,我还可以构造一个数据URI并将其放置在一个链接中。我担心的是,它只会在窗口中打开XML文件,而不会提示用户保存它

    我知道如果我要求JavaScript是本地的,我可以提高权限,直接保存文件(或者希望出现一个保存对话框)。然而,我更喜欢一个不需要提升权限的解决方案(即使是只使用Firefox3.6的解决方案)


    如果这冒犯了任何人的感情(例如,不支持所有浏览器),我深表歉意。我基本上想编写一个离线应用程序,考虑到需求的复杂性和可用时间,Javascript/HTML/CSS似乎是最佳选择。然而,我有一个唯一的要求,那就是能够保存数据,在我选择这条开发路线之前,必须克服这些要求。

    您是否在寻找类似的东西


    如果PHP还可以,那么If就容易多了。

    本地主机PHP服务器还可以吗?由于安全问题,Web传统上无法保存到硬盘。PHP可以推送文件,尽管它需要一个服务器

    打印到PDF插件可用于所有浏览器。安装一次,永远打印到PDF。然后,您可以使用javascript或Flash调用打印函数

    此外,如果您正在为internet访问不稳定的环境开发,请使用VB.NET或其他一些桌面语言

    编辑:


    您可以使用浏览器的打印功能。

    如果不深入了解您的具体需求,我不建议使用纯Javascript/HTML解决方案。从用户的角度来看,编写本机应用程序可能会获得最好的结果。但是,如果使用Javascript/HTML会更快,我建议使用承载轻量级web服务器的本地应用程序来提供您的内容。这样,您可以干净地处理文件保存服务器端,同时将大部分精力集中在前端应用程序上

    您可以在Python或Ruby中编写web服务器代码,只需几行代码,无需第三方库。例如,请参见:

    • -这一个非常简单,可以让您轻松地为所有HTML/CSS/JS文件提供服务器:

    最后-根据谁将使用您的应用程序,您还可以选择将Python程序编译为,这样最终用户就不必在其机器上安装Python。

    Javascript不允许写入本地机器。你的问题类似于


    我建议创建一个简单的桌面应用程序。

    使用IE,您可以使用document.execCommand,但我注意到IE不是一个选项

    下面是一些看起来可能有帮助的东西,尽管它不会用SaveAs对话框提示

    这个脚本怎么样

    它基于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
    });
    

    一种简单但奇怪的不需要任何闪存的方法是为其
    href
    创建
    。这甚至有很好的跨浏览器支持,不过对于IE来说,它必须至少是版本8,URI必须小于32k。在这个主题上,它看起来像是其他人。

    使用base64编码的数据URI,只有html&js才能实现这一点。您可以做的是使用js库将您想要保存的数据(在您的示例中是一个XML数据字符串)编码到base64中,如。然后将编码的字符串放入链接中,并将链接添加到DOM

    使用我提到的库(以及jquery)的示例:

    
    例子
    //在此处包括jquery和jquery-base64(或您想要使用的任何库)
    文件。写(“”);
    
    …请记住将内容类型设置为类似于
    application/octet stream
    ,这样浏览器就不会试图打开它


    警告:一些较旧的IE版本不支持base64,但您说这无关紧要,所以这对您来说应该很好。

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

    我使用数据uri运行了一个测试,如果您设置的mime类型不正确,则可以在单击链接时强制用户保存数据。这里令人难以置信的丑陋警告是,您不能指定文件名。除非浏览器在保存下载时默认询问您保存下载的位置和名称,否则它只会在您的下载文件夹中保存为一个巨大的丑陋名称,您必须找到该文件夹,并使用xml扩展名重命名以查看。因此,这是一个非解决方案。如果您不想将JS文件作为本地引用,那么如果web服务器不是一个选项,它从何处提供服务?为什么必须从网页创建XML?你可以制作一个小而简单(没有GUI)的桌面应用程序。@Jonathan,想法是灵活性,理论上我可以将整个应用程序作为一个html
    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
    });
    
    <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>