2011-06-15 71 views
0

好的,我创建了一个使用localStorage的HTML5 canvas游戏。我有localStorage完美的工作,但我不确定它遵循正确的标准,或者如果它完全正确,我已经写了它。HTML5 localStorage:我的代码是否遵循正确的标准?

//check if storage is set already, if not set the variable 
function checkLocalStorage(){ 
if (localStorage.timesPlayed){ 
timesPlayed = Number(localStorage.timesPlayed); 
} 
else{ 
timesPlayed = 0; 
} 
} 

//code snippet to increase my variable 
timesPlayed += 1; 

//code snippet to set the localStorage 
localStorage.timesPlayed = timesPlayed; 

这很好用!?但从我读过的,我应该使用localStorage.getItem和localStorage.setItem?

我应该改变我写localStorage的方式吗?

这仅仅是链接到网站,在那里我学会了这种方式来访问localStorage的 http://hacks.mozilla.org/2009/06/localstorage/

+0

不,我知道,但从网上已经有的“外面”,我应该跟着别人做什么? (指getItem,setItem) – Jacob 2011-06-15 00:23:52

+0

这可能会有所帮助 - 关于setitem,getitem的好回答http://stackoverflow.com/questions/2010892/storing-objects-in-html5-localstorage – mrk 2011-06-15 00:28:45

回答

3

它的作品,它可能不会中断,但我仍然尝试使用localStorage时正确类型的东西。 getItemsetItem是做事的首选方式,但跳到我面前的是,您获取和设置价值的方法不适用于任何类型,而只是一个数字,这意味着您必须谨慎编写代码,重新使用了很多localStorage。

您正在向localStorage发送一个号码,并将其转换为字符串。与布尔打交道时,例如这可以让你进入了很多麻烦:

var won = false; 
localStorage.isWinner = won; 
if (localStorage.isWinner) { // always true 
    alert("You won!"); 
} 

数组和对象变得丑陋太:

localStorage.test = {foo: "bar", dog: "cat"}; 
// returns "[object Object]" 

换句话说,你所拥有的作品,但它是一个从一开始就正确和一致地做事情的好习惯,因为它会在以后简化调试。正确的方法 - 与字符串,数字,数组,对象的作品 - 是这样的:

localStorage.setItem("key", JSON.stringify(value)); 
JSON.parse(localStorage.getItem("key")); 

// or as a de facto alternative 

localStorage.key = JSON.stringify(value); 
JSON.parse(localStorage.key); 
+0

感谢您的帮助!我真的在向localStorage发送一个数字,然后检索字符串并使用Number()将字符串转换为数字,以便使用timesPlayed + = 1 – Jacob 2011-06-15 13:30:02

+0

来增加它。所以,我不必使用Number()和我仍然可以使用localStorage发送和检索字符串,并使用我设置的方式。但无论如何,我将切换到getItem和setItem。 – Jacob 2011-06-15 13:37:21

+0

@Jacob,是的,你的工作方式。我不是说别的。但是使用'JSON.parse'和'JSON.stringify'方法的好处是,无论如何,它们都会从localStorage中返回正确的类型。如果你在localStorage中存储了一件事情,这不是什么大问题,但如果你一个月后回来并想重构代码会发生什么?你必须记住你已经存储了什么字符串,什么是数字,什么是布尔值。最好把这个问题扼杀在萌芽状态。 (我这样说是因为我做了一个扩展名而遇到了这个问题。) – brymck 2011-06-15 13:42:34

0

我不认为对localStorage数组访问符号是标准的一部分,但大多数浏览器实现可能会考虑到这种可能性。如果您想特别小心,请使用getItemsetItem - 但我个人并不认为这是一个问题。

Mozilla说:

虽然值可以设置并通过的getItem和setItem方法的标准JavaScript属性访问方法使用读取建议。

http://dev.w3.org/html5/webstorage/#storage-0

即使在他们所使用的属性访问记法草案中的例子,所以我觉得你行。

+0

感谢您的帮助!我可以坚持下去,但我很可能会改变为getItem和setItem。 – Jacob 2011-06-15 13:31:13

0

对于一个小的应用程序,直接读取和写入localStorage的是probaby OK,但我觉得更复杂的应用程序,这将是一个好主意,包装localStorage并提供适用于特定应用程序(例如get/setMySpecialObject和get/setMySpecialValue)的get和set方法的API。

我不认为应用程序应该关心数据存储的位置,它应该调用一个API来获取或设置它。 API背后的代码演示了如何存储它以及从哪里获取它。Genearlly最有效的方式是将数据读写到对象中,并在后台读写localStorage。第一次请求并缓存它时,从localStorage获取数据。如果一路更新,请根据需要回写到localStorage,它不应该要求应用程序发出命令才能这样做。