FirefoxがlocalStorageに対応した
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2a1pre) Gecko/20090423 Minefield/3.6a1preでは、sessionStorage、localStorage、globalStorageが存在する。
sessionStorageはページのセッション間、つまりリロードしても消えないがページを新規に開いたりした時には消える。
globalStorageとlocalStorageは、ユーザやプログラムが消さない限り、永続的に保存される。
ところで、このglobalStorageに関する説明で、
var localStorage = localStorage || globalStorage[location.hostname];Firefox 3でlocalStorageを使うには - builder
のようなソースがあるが、使用すべきではない。
トップレベルで実行すると、localStorageが存在する場合にlocalStorage = localStorage;
を実行するので、 TypeError: setting a property that has only a getter
というエラーになる。また、トップレベルのスコープ以外ではlocalStorageが存在しても、globalStorage[location.host]が代入されてしまう。
なので、最新のブラウザに対応する為には、
if (typeof localStorage != "object" && typeof globalStorage == "object") { localStorage = globalStorage[location.host]; }
とすると良い。
ただし、厳密にはlocalStorageとglobalStorageは異なり、
localStorage.hoge = 1; console.log(localStorage.hoge);
は文字列が出力されるが、
globalStorage[location.host].hoge = 1; console.log(globalStorage[location.host].hoge);
は、({value: "1", secure: "1"})
というオブジェクトが出力される。このオブジェクトには、"1"
という文字列を返すtoStringメソッドが実装されているので大抵の場合は問題ないが、文字列型を厳密に要求する場合は、.value
を参照するなどして文字列に変換する必要がある。