首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件://Firefox3.5中的脱机存储

文件://Firefox3.5中的脱机存储
EN

Stack Overflow用户
提问于 2009-07-18 21:02:37
回答 2查看 1.8K关注 0票数 1

我正在试用从http://starkravingfinkle.org/blog/2008/05/firefox-3-offline-app-demo-part-2/获取的Firefox3.5中的脱机存储代码。当页面加载时,我得到一个对话框,提示应用程序请求存储数据,但是当我按a键时,对话框不会消失。该应用程序在网站上提供的在线演示中运行良好。包含javascript的源文件如下:

todo.html

代码语言:javascript
复制
<!--
  Simple task list application used to illusrate Firefox's offline/DOMStorage capabilities

  Author: Mark Finkle
-->

<html manifest="todo.manifest">
  <head>
    <title>TODO - Offline Demo</title>
    <script type="text/javascript" src="json.js"></script>
    <script language="javascript">
    var taskStorage = "[]";
    var storageDomain = location.hostname;
    if (storageDomain == "localhost")
      storageDomain += ".localdomain";

    function loaded() {
      updateOnlineStatus("load", false);
      document.body.addEventListener("offline", function () { updateOnlineStatus("offline", true) }, false);
      document.body.addEventListener("online", function () { updateOnlineStatus("online", true) }, false);

      if (typeof globalStorage != "undefined") {
        var storage = globalStorage[storageDomain];
        if (storage && storage.taskStorage) {
          taskStorage = storage.taskStorage;
        }
      }

      fetchList();
    }

    function updateOnlineStatus(msg, allowUpdate) {
      var status = document.getElementById("status");
      status.innerHTML = (navigator.onLine ? "[online]" : "[offline]");

      var log = document.getElementById("log");
      log.appendChild(document.createTextNode("Event: " + msg + "\n"));

      if (navigator.onLine && allowUpdate) {
        update();
        log.appendChild(document.createTextNode("Updated server\n"));
      }

    }

    function httpRequest(type, data, callback) {
      var httpreq = new XMLHttpRequest();
      httpreq.onreadystatechange = function() { if (httpreq.readyState == 4) callback(httpreq.readyState, httpreq.status, httpreq.responseText); };
      httpreq.open(type, "todo-server.php", true);
      if (type == "POST") {
        httpreq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      }
      httpreq.send(data);
    }

    function loadList(readyState, status, responseText) {
      if (readyState == 4) {
        if (status == 200) {
          taskStorage = responseText;
          var tasks = eval("(" + taskStorage + ")");
          var html = "";
          for (var i=0; i<tasks.length; i++) {
            html += "<input type='checkbox' id='" + tasks[i].name + "'/><label for='" + tasks[i].name + "'>" + tasks[i].data + "</label><br/>";
          }
          document.getElementById("tasklist").innerHTML = html;


          if (typeof globalStorage != "undefined") {
            globalStorage[storageDomain].taskStorage = taskStorage;
          }
        }
      }
    }

    function fetchList() {
      if (navigator.onLine) {
        httpRequest("GET", null, loadList);
      }
      else {
        loadList(4, 200, taskStorage);
      }
    }

    function addItem() {
      var data = document.getElementById("data").value;
      document.getElementById("data").value = "";

      var tasks = eval("(" + taskStorage + ")");
      tasks.push({"name": Date.now(), "data": data });

      taskStorage = tasks.toJSONString();
      update();
    }

    function removeItems() {
      var tasks = eval("(" + taskStorage + ")");
      var newTasks = [];

      var items = document.getElementById("tasklist").getElementsByTagName("input");
      for (var i=0; i<items.length; i++) {
        if (items[i].checked == false) {
          newTasks.push(tasks[i]);
        }
      }

      taskStorage = newTasks.toJSONString();
      update();
    }

    function completeItems() {
      var tasks = eval("(" + taskStorage + ")");

      var items = document.getElementById("tasklist").getElementsByTagName("input");
      for (var i=0; i<items.length; i++) {
        if (items[i].checked) {
          var task = tasks[i].data;
          if (task.indexOf("<strike>") != -1) {
            task = task.replace("<strike>", "");
            task = task.replace("</strike>", "");
          }
          else {
            task = "<strike>" + task + "</strike>";
          }
          tasks[i].data = task;
        }
      }

      taskStorage = tasks.toJSONString();
      update();
    }

    function update() {
      if (navigator.onLine) {
        var post = "action=update&data=";
        post += encodeURIComponent(taskStorage);
        httpRequest("POST", post, function(readyState, status, json) { fetchList(); });
      }
      else {
        loadList(4, 200, taskStorage);
      }
    }
    </script>

    <style type="text/css">
      body          { font-family: verdana,tahoma, arial; }
      div#container { width: 300px; }
      div#title     { font-size: 120%; }
      div#subtitle  { font-size: 80%; }
      div#tasklist  { margin-bottom: .5em; }
      div#log       { font-size: 90%; background-color: lightgray; margin-top: 1em; white-space: pre; }
    </style>

  </head>
  <body onload="loaded();">
    <div id="container">
      <div id="title">Task Helper - <span id="status">ONLINE</span></div>
      <div id="subtitle">simple online/offline demo application</div>
      <hr />
      <div id="tasklist">
      </div>
      <input type="text" id="data" size="35" />
      <input type="button" value="Add" onclick="addItem();"/>
      <hr />
      <input type="button" value="Remove" onclick="removeItems();"/>
      <input type="button" value="Complete" onclick="completeItems();"/>
      <div id="log"><strong>Event Log</strong>
      </div>
    </div>
  </body>
</html>
EN

回答 2

Stack Overflow用户

发布于 2009-07-24 15:17:53

我相信localStorage api正在取代FF 3.5中的globalStorage。你可以在这里读到更多关于它的信息:https://developer.mozilla.org/en/DOM/Storage

我认为api非常类似,所以您可以尝试这样的方法:

代码语言:javascript
复制
var storage;
if (typeof localStorage != "undefined") {
    storage = localStorage;
}
else if (typeof globalStorage != "undefined") {
    storage = globalStorage[storageDomain];
}
if (storage && storage.taskStorage) {
    taskStorage = storage.taskStorage;
}

希望这能帮上忙!

编辑:在任何使用globalStorage的地方,您也必须检查localStorage。或者在范围内提升存储变量并检测一次。

票数 0
EN

Stack Overflow用户

发布于 2009-10-26 13:21:29

因此,在阅读了问题两遍之后,我想我理解了这个问题:在file:///文档中使用globalStorage

globalStorage (以及localStorage)在Firefox3.5版的file:///文档中不能很好地工作。我没有看到关于这个问题的具体错误报告,但是由于globalStorage被反对而支持localStorage,所以这并不重要。

如果你只是在测试它,在本地安装某种web服务器,它一点也不复杂。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1148563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档