userData的一些坑

介绍了下在应用userData进行本地存储的实现是,遇到的一些问题,包括document limit和domain limit的区别、按文档路径进行区分的数据隔离方式、必须在document.ready之后执行、缺少销毁全部数据和遍历全部数据的接口。

最近在做兼容多浏览器能跨域访问的本地存储实施方案。一开始打算是用localStorage加userData的方式实现,支持localStorage的使用localStorage,不支持的(IE6,7)使用userData;本域下的直接调用,需要跨域的则加载对应域名下的crossdomain.html作为iframe,然后调用iframe里面的contentWindow来实现。

想法是很好的,也实现了很多功能,但是在实现之后的的评审和准备应用阶段,却发现了很多开发的时候没有注意到的问题。

Document Limit/Doamin Limit

可以看看下面的表格,在每个域名下的存储限制是1M,这个很多很令人满意,但是还有个Document Limit在当初使用的时候却忽略了。userData的实现方式就是加载一个放在用户文件夹下的XML文件,在里面进行I/O操作。这每一个XML文件就是一个Document。而操作的时候,必须明确指定加载哪个XML文件。这就和localStorage的实现方式上有了很大的差别,不利于统一。而且单个Document的大小是128KB,这个很难保证后期能否足够使用。

Security Zone Document Limit (KB) Domain Limit (KB)
Local Machine 128 1024
Intranet 512 10240
Trusted Sites 128 1024
Internet 128 1024
Restricted 64 640

same directory and same protocol to access

上面那个文档的大小限制和明确指定加载的XML文件,还不算很坑的。因为短时间内128KB肯定是足够使用的,也可以在实施方案里面统一各域名下加载同一个名称的XML就好了。也就是看起来像每个域名下只有128kb的存储空间。

可是下面这个限制就很坑了。

对于userData,数据之间的划分,不单单是域名,协议和端口号这三个。它还更加严格的以文档路径进行划分,对的,不用怀疑:http://www.demo-domain.com/test/index.html是没法访问到http://www.demo-domain.com/test2/index.html里面的userData数据的。

当然,这个也能绕开,就是在使用userData的情况下,所有的I/O操作都是走的iframe,哪怕是同域名下。然后给所有域名的根域放置一个crossdomain.html。但是这样的实施方法确实有点复杂

can’t be set/get in <head>

接着还有问题,这个问题是个使用上的限制。在公司的应用环境里,有些情况,需要在加载head的时候,就能读到本地的数据,然后做一个是否跳转的判断。而userData绑定的标签是不包括head里面能放置的那些。所以很不幸userData无法实现

而且通常的使用方式是认为的createElement,然后在这个element上面进行文档的绑定。而在IE6下,向文档插入dom是必须要在document.ready之后进行的,不然会容易出现问题

can’t clear and Traversal(like function key in localStorage)

最后一个问题,在实施方案里面,公开的接口都是仿造localStorage的接口。其中有两个接口clear(清空所有内容)和key(遍历本地数据)。这两个接口使用的场景不多,但是肯定是会有使用到的时候,可惜userData的官方文档里面并没有看到有这相关的接口提供。

所以,因为上面这么多的问题,只好忍痛放弃已经开发完的localStorage和userData的组合,改为使用localStorage和FlashCookie的组合。

作者: happyWang

Hello, the beautiful world

发表评论