store.js 是一个实现了浏览器的本地存储的 JavaScript 封装 API,不是通过 Cookie 和 Flash 技术实现,而是使用 localStorage、globalStorage 和 userData 行为。
也就是说这个封装类是兼容现在绝大多数浏览器的一个在线数据存储方案。但是有一个问题却是不得不提。
笔者亲测,在IE7下效果并不好,当然是有场景的,我们准备两个页面同时调用一个store.js,A页面取得userdata值,B页面存储userdata值。我们会发现,我们用同一个浏览器打开这两个页面后,使用B存储,但是A获取不到值,但是刷新一下A页面,就可以取到值了。
我们知道userdata,
在XP下,一般位于C:\Documents and Settings\用户名\UserData,有些时候会在C:\Documents and Settings\用户名\Application Data\Microsoft\Internet Explorer\UserData。
在Vista下,位于C:\Users\用户名\AppData\Roaming\Microsoft\Internet Explorer\UserData。
当我们去查找这个文件的时候,发现有4个文件夹,和一个文件,当我们调用B页面的时候,不刷新A页面,IE会在一个文件夹里面更新那个文件,但是当我们刷新A页面的时候,IE随机在一个文件里面生成了文件,并不在原来的文件夹里面。
所以推测,IE,最起码在IE7下面,userdata是独占的,当一个页面调用后,就会对这个文件独占,只允许读,不允许写,以至B页面不得不在其他的文件夹再次新建一个存储文件。这个存储文件复制了被占用文件的内容,同时新增了最新的数据,但是A页面却无法读到,因为它任然占用着以前的那个文件。
我们看看store.js的源码,其中有一段:
1 2 3 4 5 6 7 8 9 10 | function getStorage() { if (storage) { return storage } storage = doc.body.appendChild(doc.createElement('div')); storage.style.display = 'none'; // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx storage.addBehavior('#default#userData'); storage.load(localStorageName); return storage; } |
有点类似java的单例,但是也正是这里造成了BUG,它会让IE在同一个页面生命周期里面只初始化一个storage,降低了页面性能的消耗,却带来兼容性的缺陷,这里,我们只需要做点小手术就行了。
1 2 3 4 5 6 7 8 9 10 11 12 13 | function getStorage() { if(!(-[1,])){ if (storage) { return storage } //当浏览器不为IE的时候,单例storage } storage = doc.body.appendChild(doc.createElement('div')); storage.style.display = 'none'; // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx storage.addBehavior('#default#userData'); storage.load(localStorageName); return storage; } |
转载请注明:迷路的老鼠 » 关于store.js的一个BUG