jylaurilは正しい方向に進んでいると思います。
私は遅れて遊んでいて、いくつかの奇妙な振る舞いに気づいています。
私の知る限り、JSがsetTimeoutを実行するなど、すべてのJavaScriptの実行が完了する前にlocalStorageに触れると、そのページビューではlocalStorageが空白で表示されるようです。例えば:
$(window).load(function () {
console.log("Waiting 10000ms", new Date());
setTimeout(setDeckSelect, 10000);
});
Firebugのコンソール:
Waiting 10000ms Date {Thu Dec 13 2012 10:35:48 GMT-0500 (Eastern Standard Time)}
exec.js (line 191)
getDecks Date {Thu Dec 13 2012 10:35:58 GMT-0500 (Eastern Standard Time)}
vault.js (line 23)
>>> localStorage
0 items in Storage
私は何かに取り組んでいるかもしれないと思ったが、これまでの私の理論は間違っていることが証明された。しかし、私が気付いた奇妙なことが1つあります。どれだけ待つかに関係なく、最初にデッキを調べようとすると失敗し、ローカルストレージは空になります。
>>> vault.getDecks()
[]
>>> localStorage
0 items in Storage
しかし、私がそれらを逆の順序で行うと...
>>> localStorage
8 items in Storage deck:dfs=
"{"identity":"MakingNews","cards":{}}", deck:ngrngfrn= "{"identity":"BuildingaBetterWorld","cards":{}}", deck:sdfgshsh= "{"identity":"MakingNews","cards":{}}", deck:sdfgdgdfg= "{"identity":"MakingNews","cards":{}}", deck:dfgdfgas= "{"identity":"EngineeringtheFuture","cards":{}}", deck:sdfsga= "{"identity":"MakingNews","cards":{}}", deck:gdgd= "{"identity":"MakingNews","cards":{}}", deck:gfsdfgsdfg= "{"identity":"BuildingaBetterWorld","cards":{}}"
>>> vault.getDecks()
[Object { name= "dfgdfgas", key= "deck:dfgdfgas"}, Object { name= "dfs", key= "deck:dfs"}, Object { name= "gdgd", key= "deck:gdgd"}, Object { name= "gfsdfgsdfg", key= "deck:gfsdfgsdfg"}, Object { name= "ngrngfrn", key= "deck:ngrngfrn"}, Object { name= "sdfgdgdfg", key= "deck:sdfgdgdfg"}, Object { name= "sdfgshsh", key= "deck:sdfgshsh"}, Object { name= "sdfsga", key= "deck:sdfsga"}]
localStorageを関数に記録すると、次のようにも機能します。
vault.getDecks = function () {
console.log(localStorage);
var keys = Object.keys(localStorage),
out = [],
i,
k,
name = "";
for (i = 0; i < keys.length; i++) {
k = keys[i];
name = vault.friendlyName(k);
if (name !== k && localStorage[k]) {
out.push({name: name, key: k});
}
}
out.sort(function (a, b) {
return a.name > b.name ? 1 : -1;
});
return out;
};
できます。私がそれを無効にすると、しかし...
vault.getDecks = function () {
// console.log(localStorage);
void localStorage;
var keys = Object.keys(localStorage),
out = [],
i,
k,
name = "";
for (i = 0; i < keys.length; i++) {
k = keys[i];
name = vault.friendlyName(k);
if (name !== k && localStorage[k]) {
out.push({name: name, key: k});
}
}
out.sort(function (a, b) {
return a.name > b.name ? 1 : -1;
});
return out;
};
それは動作しません。voidキーワードを削除し、ステートメントとしてlocalStorageを単独で使用した場合も、機能しません。
理由はわかりませんが、console.log(localstorage)で修正されているようで、いつでもlocalStorageを呼び出すことができます。
本当におかしい。
編集:私は少し良い解決策を見つけました。localStorageの「length」属性の呼び出しも同様に機能します。
vault.getDecks = function () {
//Weird hack to make FF load localStorage correctly...
localStorage.length;
var keys = Object.keys(localStorage),
out = [],
i,
k,
name = "";
for (i = 0; i < keys.length; i++) {
k = keys[i];
name = vault.friendlyName(k);
if (name !== k && localStorage[k]) {
out.push({name: name, key: k});
}
}
out.sort(function (a, b) {
return a.name > b.name ? 1 : -1;
});
return out;
};
これは、何もログに記録されないという点で少し優れています...