2009-07-18 3 views
1

의 오프라인 저장소 http://starkravingfinkle.org/blog/2008/05/firefox-3-offline-app-demo-part-2/에서 가져온 Firefox 3.5의 오프라인 저장소 코드를 사용해 보았습니다. 페이지가로드 될 때 응용 프로그램에서 데이터 저장을 요구하는 대화 상자가 표시되지만 허용을 누르면 대화 상자가 사라지지 않습니다. 이 응용 프로그램은 웹 사이트에서 제공되는 온라인 데모에서 잘 작동합니다. 다음과 같은 스크립트를 포함 소스 파일이다파일 : //

todo.html

<!-- 
    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> 

답변

0

I는 로컬 스토리지 API는 FF 3.5 인 globalStorage 교체이라고 믿는다. https://developer.mozilla.org/en/DOM/Storage

내가 API는 매우 유사하다고 생각, 그래서 당신은 이런 식으로 뭔가를 시도 할 수 있습니다 : 당신은 여기에 대한 자세한 내용을보실 수 있습니다

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

희망이 도움이!

EDIT : globalStorage를 사용하는 곳이라면 localStorage도 확인해야합니다. 또는 스토리지 변수를 범위에서 승격시키고 한 번 감지하십시오.

0

질문을 두 번 읽은 후에 나는 file : /// 문서에서 globalStorage을 사용할지 묻는 질문을 이해했다고 생각합니다.

globalStorage (as well as localStorage)은 Firefox 3.5의 문서에서 file:/// 문서가 잘 작동하지 않습니다. 이 문제에 대한 특정 버그 보고서를 보지 못했지만, globalStorage에 대해서는 localStorage을 사용하지 않으므로 별 문제가되지 않습니다.

그냥 테스트 해 본다면 일종의 웹 서버를 로컬에 설치하면 복잡하지 않습니다.