37

我很确定答案是否定的,因此 google gears、adobe AIR 等。

如果我是对的,那么http://tiddlywiki.com是如何工作的?它是持久的并用 javascript 编写。它也只是一个没有外部(服务器端)依赖的 HTML 文件。怎么回事?它在哪里/如何存储它的状态?

4

6 回答 6

46

Tiddlywiki has several methods of saving data, depending on which browser is used. As you could see in the source.

  • If ActiveX is enabled, it uses Scripting.FileSystemObject.
  • On Gecko-based browsers, it tries to use UniversalXPConnect.
  • If Java is enabled, it uses the TiddlySaver Java applet.
  • If Java LiveConnect is enabled, it tries to use Java's file classes.
于 2009-07-06T14:23:24.643 回答
36

HTML5 的 File[ 1 ]、FileWriter[ 2 ] 和 FileSystem[ 3 ] API 可在 Google Chrome 的最新开发者频道中找到。FileSystem API 允许您在浏览器知道的空间内读取/写入沙盒文件系统。例如,您不能打开用户本地 FS 上的“我的图片”文件夹并对其进行读/写。这是正在进行的工作,但暂时不会准备好。写文件的例子:

window.requestFileSystem(
  TEMPORARY,        // persistent vs. temporary storage
  1024 * 1024,      // 1MB. Size (bytes) of needed space
  initFs,           // success callback
  opt_errorHandler  // opt. error callback, denial of access
);

function initFs(fs) {
  fs.root.getFile('logFile.txt', {create: true}, function(fileEntry) {

    fileEntry.createWriter(function(writer) {  // FileWriter

      writer.onwrite = function(e) {
        console.log('Write completed.');
      };

      writer.onerror = function(e) {
        console.log('Write failed: ' + e.toString());
      };

      var bb = new BlobBuilder();
      bb.append('Lorem ipsum');
      writer.write(bb.getBlob('text/plain'));

    }, errorHandler);
  }
}

查看此HTML5 存储幻灯片以获取更多代码片段。

于 2010-11-25T17:00:36.910 回答
12

It uses a java file references like this:

drivers.tiddlySaver = {
        name: "tiddlySaver",
        deferredInit: function() {
            if(!document.applets["TiddlySaver"] && !$.browser.mozilla && !$.browser.msie && document.location.toString().substr(0,5) == "file:") {
                $(document.body).append("<applet style='position:absolute;left:-1px' name='TiddlySaver' code='TiddlySaver.class' archive='TiddlySaver.jar' width='1'height='1'></applet>");
            }
        },
        isAvailable: function() {
            return !!document.applets["TiddlySaver"];
        },
        loadFile: function(filePath) {
            var r;
            try {
                if(document.applets["TiddlySaver"]) {
                    r = document.applets["TiddlySaver"].loadFile(javaUrlToFilename(filePath),"UTF-8");
                    return (r === undefined || r === null) ? null : String(r);
                }
            } catch(ex) {
            }
            return null;
        },
        saveFile: function(filePath,content) {
            try {
                if(document.applets["TiddlySaver"])
                    return document.applets["TiddlySaver"].saveFile(javaUrlToFilename(filePath),"UTF-8",content);
            } catch(ex) {
            }
            return null;
        }
    }
于 2009-07-06T14:24:34.220 回答
4

javascript可以访问文件系统吗?

据我所知,不在上述沙盒区域之外。但是,它可以访问已签名的 Java 小程序,该小程序具有可调用的公共方法,可以访问所有文件。我已经做到了,它工作正常并且是跨浏览器的。

签名部分有些涉及,对于专业用途,您可能需要支付授权您身份的代码签名证书。从 Verisign 之类的地方获取。这样用户至少知道小程序是由谁编写的(如果有帮助的话)。您可以自己免费签名,但其中一个“可能的安全风险”弹出窗口会在用户首次使用时出现以供用户授权。

您会认为此类用于文件写入的签名小程序已经存在以供下载,但我无法通过搜索找到任何内容。如果他们这样做了,您只需将其插入您的页面,学习 API 即可。

于 2011-07-15T18:49:15.190 回答
4

从技术上讲,你可以做到

netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserWrite');

在与 netscape 兼容的浏览器(Firefox、Mozilla、Netscape)中,它会询问用户*是否允许文件系统访问,但这不是可移植的。

*每个浏览器进程一次

于 2009-07-06T15:23:40.113 回答
2

The answer is indeed NO. Java applets, and the dreaded ActiveX plugins are usually used if this is required

于 2009-07-06T14:25:05.170 回答