前一段时间做一个在线订单系统,因为有好几项服务可供选择,要求在选每一种服务后进入下一步,在操作过程中还可以通过上一步来回到上一次的服务选购里重新下订,每一个种服务都有好多选项可选,整个过程中有较大的数据量要临时存储,

现在最流行的本地存储莫过于 cookie 的应用,但 浏览器对cookie有很多限制 ,最大的限制在于其对cookie 总大小,仅为 4K 左右(包括名(name)、值(value)和等号)。

对于复杂一点的应用和需求,仅有的 4K 大小还是有点相形见绌,其实很多浏览器(IE、Firefox、Safari)本身也提供了自己的本地存储的功能,或许在特定的环境下能满足我们。因此自己通过学习整理,写了一个userData的简单操作类。

应用范围

UserData是微软为IE专门在系统中开辟的一块存储空间,所以说只支持Windows+IE的组合,实际测试在2000(IE5.5)、XP(IE6、IE7),Vista(IE7)下都是可以正常使用的。

在哪儿?

在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。

  1. 从安全方面考虑,一个 userData 存储区只能用于同一目录和对同一协议进行存储。
  2. 如果使用 userData behavior 不正确可能会对你的应用造成危害,userData 存储区中的数据没有加密因而不安全的。任何可以访问 UserData 保存磁盘的应用都可以访问该数据,所以,推荐不要保存敏感的数据,比如信用卡号,详细:《Security Considerations: DHTML and Default Behaviors》
  3. userData behavior 会跨 session 存储信息到存储区,这提供了动态的数据结构和比 cookie(一般 4KB) 更大的容量。userData 存储区的容量依赖于 domain 的安全域。下表显示的是 userData 存储最大容量,对单独文档和整个域名的所有文档都适用,但基于安全域。
  4. 如果设置 userData behavior 到 html、head、title 或者 style 对象上,当 save 和 load 方法被调用时会出错。如果必须设置到 style 中,可以设置内联或者文档头,例如:
    <style>
        .storeuserData {behavior:url(#default#userData);}
    </style>
  5. 对于 userData behavior 来说 ID 是可选的,但是如果有,则会改善执行性能。
  6. userData 可以将数据以 XML 格式保存在客户端计算机上,一般保存在 C(WIN 系统盘):/Documents and Settings/XXX/UserData/ 文件夹下。
  7. userData 数据一直存在,除非人为删除或者用脚本设置该数据的失效日期(expires)。

容量

网页制作完成手册中这样说:

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

线上使用时,单个文件的大小限制是128KB,一个域名下总共可以保存1024KB的文件,文件个数应该没有限制。在受限站点里这两个值分别是64KB和640KB,所以如果考虑到各种情况的话,单个文件最好能控制64KB以下。

如何使用?

用下面的JS语句就可以建立一个支持UserData的对象:

o = document.createElement('input');
o.type = "hidden";
o.addBehavior ("#default#userData");
//UserData.o.style.behavior = "url('#default#userData')" ;
//上面的语句也是一样的作用
document.body.appendChild(o);

说白了UserData就是样式里的一个Behavior,所以这样写也是一样的:

<input type=hidden class= storeuserData />
<style>
.storeuserData {behavior:url(#default#userData);}
</style>

UserData可以绑定在大多数的html标签上,具体为:

A, ACRONYM, ADDRESS, AREA, B, BIG, BLOCKQUOTE, BUTTON, CAPTION, CENTER, CITE, CODE, DD, DEL, DFN, DIR, DIV, DL, DT, EM, FONT, FORM, hn, HR, I, IMG, INPUT type=button, INPUT type=checkbox, INPUT type=file, INPUT type=hidden, INPUT type=image, INPUT type=password, INPUT type=radio, INPUT type=reset, INPUT type=submit, INPUT type=text, KBD, LABEL, LI, LISTING, MAP, MARQUEE, MENU, OBJECT, OL, OPTION, P, PLAINTEXT, PRE, Q, S, SAMP, SELECT, SMALL, SPAN, STRIKE, STRONG, SUB, SUP, TABLE, TEXTAREA, TT, U, UL, VAR, XM

UserData对象有以下的属性和方法:

属性

描述

expires

设置或读取文件过期时间

XMLDocument

读取文件的XML DOM

方法

描述

getAttribute

读取指定属性的值

load

打开文件

removeAttribute

删除指定的属性

save

保存文件

setAttribute

为指定属性赋值

UserData文件实际上就是一个XML文件,通过文件名->属性的方式保存字符串,如以下一段代码:

o.setAttribute("code", "hello world!");
o.save("baidu");

执行后,UserData文件夹中会生成一个baidu[1].xml文件,其中的内容是:
<ROOTSTUB code="hello,world!"/>

UserData类

function behaviorUserdata(udObj) { var me = this; var loaded = ''; //当前已载入的文件名 this.udObj = getObject(udObj); this.udObj.style.behavior = 'url(#default#userdata)'; this.value = this.udObj.value; this.inhtml = this.udObj.innerHTML; //检查文件是否存在,存在est=undefined并返回true否则返回false this.exist = function(filename){ try{ me.udObj.load(filename);//将文件名为 filename的 XML 载入 me.loaded = filename; return true; }catch(e){ return false;} } //预加载 this.preLoad = function(filename){ if(me.loaded=='' || me.loaded!=filename){me.exist(filename);} return me.loaded; } //获取指定的属性值 this.getAtrib = function(filename,atrib){ if(me.preLoad(filename)!='') { var val = me.udObj.getAttribute(atrib); return val==null?"":val; }return ""; } //移除对象的指定属性 this.remAtrib = function(filename,atrib){ me.udObj.removeAttribute(atrib); me.udObj.save(filename); //将对象数据保存到名为filename的XML文件里面 return true; } //设置指定的属性值 this.setAtrib = function(filename,atrib,val,expire){ var etime = typeof(expire)=="undefined"?24*60*60:expire; me.udObj.expires = me.setExpire(etime); me.udObj.setAttribute(atrib,val); me.udObj.save(filename); } //设置一个系列的对象数据(即整个XML文件)失效 this.remPartion = function(filename){ if(me.exist(filename)) { me.udObj.expires = me.setExpire(-1); me.udObj.save(filename); } } //设置有效期 this.setExpire = function(sec){ var oTimeNow = new Date(); oTimeNow.setSeconds(oTimeNow.getSeconds() + parseInt(sec)); return oTimeNow.toUTCString(); } }

UserData使用总结相关推荐

  1. Android系统源码学习——ramdisk.img、system.img、userdata.img三个文件介绍

    2019独角兽企业重金招聘Python工程师标准>>> Android源码编译后,在out/target/product/generic下生成的三个镜像文件:ramdisk.img, ...

  2. 问题:Unable to find a 'userdata.img' file for ABI armeabi to copy into the AVD folder.

    创建AVD时,发现创建不成功,报错"Unable to find a 'userdata.img' file for ABIarmeabi to copy into the AVD fold ...

  3. 设计一个shell程序,在/userdata目录下建立50个目录,并对每个目录给754权限!

    设计一个Shell程序,在/userdata目录下建立50个目录,即user1-user50,并设置每个目录的权限,其中其他用户的权限为:读:文件所有者的权限为:读.写.执行:文件所有者所在组的权限为 ...

  4. Android 系统镜像: boot.img kernel.img ramdisk.img system.img userdata.img cache.img recovery.img

    boot.img(kernel.img+ramdisk.img) ramdisk.img(/) system.img(/system) userdata.img(/data) cache.img(/c ...

  5. lua userdata

    2019独角兽企业重金招聘Python工程师标准>>> userdata类型是为了方便C/C++对Lua进行扩展,因为在用C/C++扩展时,我们经常会自定义数据类型,如: typed ...

  6. IE userdata

    在Internet Explorer 5中,Microsoft提供了名为userData的客户端持久存储功能.它是通过对CSS行为进行特殊扩展来实现的.这些扩展完全都是非标准的,是 90年代后期浏览器 ...

  7. Android 的 ramdisk.img、system.img、userdata.img 作用说明,以及UBoot 系统启动过程

    首先通過編譯,先將android內核編譯成功.正常情況下,在目錄out/target.product/generic/(但是有的就沒有generic文件,如freescale和iriver:但是lon ...

  8. Android ramdisk.img system.img userdata.img 介绍与使用

    android源码编译后得到system.img,ramdisk.img,userdata.img映像文件.其中, ramdisk.img是emulator的文件系统,system.img包括了主要的 ...

  9. android系统镜像:boot.img kernel.img ramdisk.img system.img userdata.img cache.img recovery.img

    boot.img(kernel.img+ramdisk.img) ramdisk.img(/) system.img(/system) userdata.img(/data) cache.img(/c ...

  10. lua把userdata写入mysql_Lua教程(十九):userdata

    在Lua中可以通过自定义类型的方式与C语言代码更高效.更灵活的交互.这里我们通过一个简单完整的示例来学习一下Lua中userdata的使用方式.需要说明的是,该示例完全来自于Programming i ...

最新文章

  1. 数据结构和算法:第八章 图论算法
  2. 51Nod-2149子串水题find
  3. 用 Hadoop 进行分布式并行编程, 第 3 部分 部署到分布式环境
  4. java面试题大合集(开发者必看一)
  5. 联想linux笔记本评测,联想(lenovo)G460AL-ITH Linux笔记本电脑接口评测-ZOL中关村在线...
  6. 老师们的神操作,但凡有一个是我的老师,我必定能上清华
  7. 学习PowerShell和SQL Server –简介
  8. mysql dwith ssl_mysql replication支持ssl(一主一从)
  9. Linux命令解释之crontab
  10. 必须掌握的Java基础知识(一)
  11. mysql返回李连杰的姓_李连杰:我爷爷不姓李,说出名字后害怕你们没胆量播出去...
  12. xmind可以画流程图吗_如何用xmind做流程图
  13. donet 微服务开发 学习-consul 服务端Api开发
  14. 【虚幻4】从U3D到UE4的转型之路
  15. DBA与项目的那堆事 ——目录
  16. 超级账本Hyperledger-Fabric本地编译与安装(来源于区块链-原理、设计与应用)
  17. 简单说说USB协议(一)
  18. Glide-加载Gif
  19. 2021年应届生的就业形势怎么样呢?
  20. 湖北工业大学校园网自动认证

热门文章

  1. P1577切绳子问题
  2. UVa 10101 - Bangla Numbers
  3. ParsingError问题的解决
  4. 爱立信软件测试英语笔试题,爱立信测试平台(dallas)开发岗位offer咨询
  5. xampp mysql5.6_xampp (php5.6)免费官方版下载-xampp v5.6.36 win32 X86下载 - QT软件园
  6. socks代理服务器协议的说明
  7. MySQL中order by 结果不准确的问题及解决
  8. 基于STM32F030驱动MQ7一氧化碳传感器
  9. 【转】告诉你外语学习的真实方法及误区分析(精编版)-part 1
  10. iOS大型项目开发漫谈