相称多浏览器的本地存款和储蓄,推断safir浏览器存款和储蓄数据

var Safir = {
GetLocalStorage: function (key) {
var storage = window.localStorage;
if (storage.getItem(key)) {
var l = storage.getItem(key);
return l;
} else {
return “0”;
}
},
DeleteSessionStorage: function (key) {
var f = “0”;
storage = window.sessionStorage;
try {
storage.removeItem(key);
f = “1”;
} catch (error) {
f = “2”;
}
return f;
},
DeleteLocalStorage: function (key) {
var f = “0”;
storage = window.localStorage;
try {
storage.removeItem(key);
f = “1”;
} catch (error) {
f = “2”;
}
return f;
},
IsSessionStorage: function (key) {
var f = false;
storage = window.sessionStorage;
try {
storage.setItem(key, key);
storage.removeItem(key);
f = true;
} catch (error) {
f = false;
}
return f;
},
AddLocalStorage: function (key) {
var f = “0”;
storage = window.localStorage;
try {
storage.removeItem(key);
storage.setItem(key, key);
f = “1”;
} catch (error) {
f = “2”;
}
return f;
},
AddLocalStorage: function (key, value) {
var f = “0”;
storage = window.localStorage;
try {
storage.removeItem(key);
storage.setItem(key, value);
f = value;
} catch (error) {
f = “2”;
}
return f;
},
AddSessionStorage: function (key) {
var f = “0”;
storage = window.sessionStorage;
try {
storage.removeItem(key);
storage.setItem(key, key);
f = “1”;
} catch (error) {
f = “2”;
}
return f;
},
AddSessionStorage: function (key, value) {
var f = “0”;
storage = window.sessionStorage;
try {
storage.removeItem(key);
storage.setItem(key, value);
f = value;
} catch (error) {
f = “2”;
}
return f;
}
}
var Phone = {
Versions: function () {
var u = navigator.userAgent, app = navigator.appVersion;
return {
mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是或不是为运动终端
ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
android: u.indexOf(‘Android’) > -1, //android终端
iPhone: u.indexOf(‘iPhone’) > -1, //是否为iPhone
iPad: u.indexOf(‘iPad’) > -1, //是否iPad
web基特: u.indexOf(‘AppleWebKit’) > -壹, //苹果、谷歌(谷歌)根本
QQBrowser: u.indexOf(‘QQBrowser’) > -1,
QQ: u.indexOf(‘QQ’) > -1,
wechat: function () {
if (u.match(/MicroMessenger/i) == ‘MicroMessenger’)
{ return true; }
else { return false; }
} ()
};
} ()
}
var cookie = {
addCookie: function (key, value, time) {
$.cookie(key, value, { expires: 1, path: ‘/’, domain:
‘.neihanhongbao.com’, secure: false, raw: false });
},
getCookie: function (key) {
return $.cookie(key);
},
delCookie: function (key) {
$.cookie(key, ”, { expires: -1 });
},
checkCookie: function (key) {
var f = “0”;
if ($.cookie(key) == undefined || $.cookie(key) == “”) {
f = “1”;
}
else {
f = “2”;
}
return f;
}
}

var Safir = {
GetLocalStorage: function (key) {
var storage = window.localStorage;
if (storage.getItem(key)) {
var l = storage.getItem(key);
return l;
} else {
return “0”;
}
},
DeleteSessionStorage: function (key) {
var f = “0”;
storage = window.sessionStorage;
try {
storage.removeItem(key);
f = “1”;
} catch (error) {
f = “2”;
}
return f;
},
DeleteLocalStorage: function (key) {
var f = “0”;
storage = window.localStorage;
try {
storage.removeItem(key);
f = “1”;
} catch (error) {
f = “2”;
}
return f;
},
IsSessionStorage: function (key) {
var f = false;
storage = window.sessionStorage;
try {
storage.setItem(key, key);
storage.removeItem(key);
f = true;
} catch (error) {
f = false;
}
return f;
},
AddLocalStorage: function (key) {
var f = “0”;
storage = window.localStorage;
try {
storage.removeItem(key);
storage.setItem(key, key);
f = “1”;
} catch (error) {
f = “2”;
}
return f;
},
AddLocalStorage: function (key, value) {
var f = “0”;
storage = window.localStorage;
try {
storage.removeItem(key);
storage.setItem(key, value);
f = value;
} catch (error) {
f = “2”;
}
return f;
},
AddSessionStorage: function (key) {
var f = “0”;
storage = window.sessionStorage;
try {
storage.removeItem(key);
storage.setItem(key, key);
f = “1”;
} catch (error) {
f = “2”;
}
return f;
},
AddSessionStorage: function (key, value) {
var f = “0”;
storage = window.sessionStorage;
try {
storage.removeItem(key);
storage.setItem(key, value);
f = value;
} catch (error) {
f = “2”;
}
return f;
}
}
var Phone = {
Versions: function () {
var u = navigator.userAgent, app = navigator.appVersion;
return {
mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是不是为运动终端
ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
android: u.indexOf(‘Android’) > -1, //android终端
iPhone: u.indexOf(‘iPhone’) > -1, //是否为iPhone
iPad: u.indexOf(‘iPad’) > -1, //是否iPad
webKit: u.indexOf(‘AppleWebKit’) > -1, //苹果、谷歌(Google)基本
QQBrowser: u.indexOf(‘QQBrowser’) > -1,
QQ: u.indexOf(‘QQ’) > -1,
wechat: function () {
if (u.match(/MicroMessenger/i) == ‘MicroMessenger’)
{ return true; }
else { return false; }
} ()
};
} ()
}
var cookie = {
addCookie: function (key, value, time) {
$.cookie(key, value, { expires: 1, path: ‘/’, domain:
‘.neihanhongbao.com’, secure: false, raw: false });
},
getCookie: function (key) {
return $.cookie(key);
},
delCookie: function (key) {
$.cookie(key, ”, { expires: -1 });
},
checkCookie: function (key) {
var f = “0”;
if ($.cookie(key) == undefined || $.cookie(key) == “”) {
f = “1”;
}
else {
f = “2”;
}
return f;
}
}

  
在做试验系统时索要减轻那样1个难题,正是当考生考试时可能出出现断网、关闭浏览器,刷新等难点,数据此时可能未有立即写入数据库,所以形成数据丢失难题,,所以那里就必要用到本地存款和储蓄,从前的本子都以用cookie,不过只可以说cookie太小了,只有丰硕的四k,而机房的网有时候其实是令人捉急,所以,思量换一种方案。

协作多浏览器的本土存款和储蓄,

在做试验系统时索要缓慢解决那样一个难题,就是当考生考试时或然出出现断网、关闭浏览器,刷新等难点,数据此时恐怕未有立即写入数据库,所以变成数据丢失难点,,所以那边就要求用到地面存款和储蓄,从前的版本都以用cookie,可是只可以说cookie太小了,唯有丰富的四k,而机房的网有时候其实是令人捉急,所以,挂念换壹种方案。

直接读取XML完成格局

   
因为本地存款和储蓄平常接触的不是太多,伊始想的只是简短的读取本地的XML,做起来倒是挺轻易的,一个言语就能化解:

  1. <script language=”javascript”type=”text/javascript”>  
  2.                   var fso, f1, ts, s;  
  3.          varForReading = 1;  
  4.          fso= new ActiveXObject(“Scripting.FileSystemObject”);  
  5.          //成立文件  
  6.      f1 =fso.CreateTextFile(“F:\\testfile.txt”, true);  
  7.          //填写一行数据  
  8.          f1.WriteLine(“作者是美丽的丫头”);  
  9.          f1.WriteBlankLines(1);  
  10.          //关闭文件  
  11.          f1.Close();  
  12.          //展开文件  
  13.          ts= fso.OpenTextFile(“F:\\list.xml”, ForReading);  
  14.           var nodes = ts.documentElement.childNodes;  
  15.          //读取文件1行内容到字符串  
  16.          s= ts.ReadLine();  
  17.          //展现字符串新闻  
  18.          alert(“文件新闻是: “+s);  
  19.          //关闭文件  
  20.          ts.Close();  
  21.           
  22. </script>  

 

   
不过这么写纵然简易,带来的害处也不少,于是上网查到UserData能够缓慢解决这些主题素材。

一贯读取XML达成格局

   
因为本地存款和储蓄平常接触的不是太多,开始想的只是简短的读取本地的XML,做起来倒是挺轻易的,一个口舌就能化解: 

  1. <script language=”javascript”type=”text/javascript”>  
  2.                   var fso, f1, ts, s;  
  3.          varForReading = 1;  
  4.          fso= new ActiveXObject(“Scripting.FileSystemObject”);  
  5.          //成立文件  
  6.      f1 =fso.CreateTextFile(“F:\\testfile.txt”, true);  
  7.          //填写一行数据  
  8.          f一.WriteLine(“笔者是雅观的丫头”);  
  9.          f1.WriteBlankLines(1);  
  10.          //关闭文件  
  11.          f1.Close();  
  12.          //展开文件  
  13.          ts= fso.OpenTextFile(“F:\\list.xml”, ForReading);  
  14.           var nodes = ts.documentElement.childNodes;  
  15.          //读取文件1行内容到字符串  
  16.          s= ts.ReadLine();  
  17.          //呈现字符串音讯  
  18.          alert(“文件消息是: “+s);  
  19.          //关闭文件  
  20.          ts.Close();  
  21.           
  22. </script>  

 

   
不过如此写即便简易,带来的害处也不少,于是上网查到UserData能够搞定那么些标题。

UserData完结格局:

   
userData行为通过将数据写入四个UserData存款和储蓄区(UserDatastore)来保存数据,userData能够将数据以XML格式保存在客户端Computer上,即使您用的是
Windows 三千 恐怕 Windows XP,是保存在C:\Documents and
Settings\Liming\UserData\文本夹下(若是操作系统不是安装在C盘,那么C就活该是操作系统所在的分区)。

    该数量将直接存在,除非你人为删除只怕用剧本设置了该数额的失效期。

   
userData行为提供了多少个比Cookie更兼具动态性和更加大体量的数据结构。每页的UserData存款和储蓄区数据大小能够直达64
Kb,各个域名可以达到640 Kb。

   
userData行为通过sessions为各样对象分配UserData存款和储蓄区。使用save和load方法将UserData存储区数据保存在缓存(cache)中。1旦UserData存款和储蓄区保存以往,固然IE浏览器关闭恐怕刷新了,下3回跻身该页面,数据也可以再次载入而不会丢掉。

   
可是,UserData是IE的东西,所以任何浏览器不合作,当时,因为今后做的那几个试验系统一般景色下都在UserData下使用,所以也达成了1晃:

 

[html] view
plaincopy澳门葡京 1澳门葡京 2
 

  1. <HTML>  
  2. <HEAD>  
  3. <STYLE>  
  4. .userData{behavior:url(#default#userdata);}  
  5. </STYLE>  
  6. <SCRIPT>  
  7. function fnSaveInput(){  
  8. var oPersist=oPersistForm.oPersistInput;  
  9. oPersist.setAttribute(“sPersist”,oPersist.value);//将oPersist.value存储为sPersist属性  
  10. oPersist.save(“oXMLBranch”); //存款和储蓄在名字为oXMLBranch的UserData存款和储蓄区  
  11. }  
  12. function fnLoadInput(){  
  13. var oPersist=oPersistForm.oPersistInput;  
  14.  varabc=oPersist.load(“oXMLBranch”); //载入在名字为oXMLBranch的UserData存储区  
  15. oPersist.value=oPersist.getAttribute(“sPersist”);//将sPersist属性赋值给oPersist.value  
  16. }  
  17. </SCRIPT>  
  18. </HEAD>  
  19. <BODY>  
  20. <FORM ID=”oPersistForm”>  
  21. <INPUT CLASS=”userData”TYPE=”text” ID=”oPersistInput”>  
  22. <INPUT TYPE=”button”VALUE=”Load” onclick=”fnLoadInput()”>  
  23. <INPUT TYPE=”button”VALUE=”Save” onclick=”fnSaveInput()”>  
  24. </FORM>  
  25. </BODY>  
  26. </HTML>  

 

UserData落成格局:

   
userData行为因而将数据写入一个UserData存款和储蓄区(UserDatastore)来保存数据,userData能够将数据以XML格式保存在客户端计算机上,假诺您用的是
Windows 三千 或然 Windows XP,是保存在C:\Documents and
Settings\Liming\UserData\文本夹下(假设操作系统不是设置在C盘,那么C就活该是操作系统所在的分区)。

    该数额将平昔留存,除非你人为删除也许用剧本设置了该数据的失效期。

   
userData行为提供了三个比Cookie更兼具动态性和更加大体量的数据结构。每页的UserData存款和储蓄区数据大小能够直达64
Kb,每种域名能够直达640 Kb。

   
userData行为经过sessions为每一种对象分配UserData存储区。使用save和load方法将UserData存款和储蓄区数据保存在缓存(cache)中。壹旦UserData存款和储蓄区保存现在,即便IE浏览器关闭只怕刷新了,下三次跻身该页面,数据也能够重新载入而不会丢掉。

   
不过,UserData是IE的事物,所以任何浏览器不包容,当时,因为未来做的那几个考试系统一般意况下都在UserData下利用,所以也兑现了弹指间:

 

  1. <HTML>  
  2. <HEAD>  
  3. <STYLE>  
  4. .userData{behavior:url(#default#userdata);}  
  5. </STYLE>  
  6. <SCRIPT>  
  7. function fnSaveInput(){  
  8. var oPersist=oPersistForm.oPersistInput;  
  9. oPersist.setAttribute(“sPersist”,oPersist.value);//将oPersist.value存储为sPersist属性  
  10. oPersist.save(“oXMLBranch”); //存款和储蓄在名称叫oXMLBranch的UserData存款和储蓄区  
  11. }  
  12. function fnLoadInput(){  
  13. var oPersist=oPersistForm.oPersistInput;  
  14.  varabc=oPersist.load(“oXMLBranch”); //载入在名称叫oXMLBranch的UserData存款和储蓄区  
  15. oPersist.value=oPersist.getAttribute(“sPersist”);//将sPersist属性赋值给oPersist.value  
  16. }  
  17. </SCRIPT>  
  18. </HEAD>  
  19. <BODY>  
  20. <FORM ID=”oPersistForm”>  
  21. <INPUT CLASS=”userData”TYPE=”text” ID=”oPersistInput”>  
  22. <INPUT TYPE=”button”VALUE=”Load” onclick=”fnLoadInput()”>  
  23. <INPUT TYPE=”button”VALUE=”Save” onclick=”fnSaveInput()”>  
  24. </FORM>  
  25. </BODY>  
  26. </HTML>  

 

相称多浏览器的本地存款和储蓄,推断safir浏览器存款和储蓄数据。HTML5 LocalStorage   

   
不过,毕竟UserData有她的局限性,处于包容思考,也在落到实处过程中听别人说了一种叫HTML5 LocalStorage 的东西。

要介绍HTML伍 LocalStorage,首先介绍一下地面存款和储蓄的野史:

澳门葡京 3

 

   
从此处能够看出来,本地存款和储蓄一路从Cookies走到结尾,真心的不易于,那么,HTML五 LocalStorage 具体有如何收益呢?

   
最早的Cookies自然是豪门都驾驭,难题主要正是太小,大约也就4KB的旗帜,而且IE5头扶助每种域名18个cookies,太少了。优势正是我们都支持,而且匡助得还蛮好。很早以前那个禁止使用cookies的用户也都慢慢的不设有了,就就像是从前禁止使用javascript的用户不存在了千篇壹律。

   
userData是IE的事物。今后用的最多的是Flash,空间是Cookie的二伍倍,基本够用。再之后谷歌推出了Gears,尽管并没有限制,但不适的地方就是要装额外的插件。到了HTML5把这几个都合并了,官方建议是各类网址5MB,十分的大了,就存些字符串,丰富了。相比较诡异的是竟然全部帮衬的浏览器目前都采纳的伍MB,即使有1对浏览器能够让用户安装,但对于网页制作者来讲,近期的地形就5MB来酌量是相比较妥帖的。

    那么,有如何浏览器接济她吗?

澳门葡京 4

 

   
所以依照图大家能够看来,本领从而的浏览器都支持HTML伍 LocalStorage,所以,那也让本地存储前途一片光明啊!

    上边写叁个简单易行的实例:

  1. <body>  
  2. <p>You have viewed this page <spanidspanid=”count”>0</span> time(s).</p>  
  3. <p><input type=”button”value=”changeStorage” onClick=”changeS()”/></p>  
  4. <script>  
  5.          varstorage = window.localStorage;  
  6.           
  7.          if(!storage.getItem(“pageLoadCount”))storage.setItem(“pageLoadCount”,0);  
  8.                    storage.pageLoadCount= parseInt(storage.getItem(“pageLoadCount”)) + 一;//必须格式调换  
  9.                    document.getElementById(“count”).innerHTML= storage.pageLoadCount;  
  10.                    showStorage();  
  11.                    if(window.addEventListener){  
  12.                     window.addEventListener(“storage”,handle_storage,false);  
  13.                    }elseif(window.attachEvent){  
  14.                     window.attachEvent(“onstorage”,handle_storage);  
  15.          }  
  16.           
  17.          functionhandle_storage(e){  
  18.                     if(!e){e=window.event;}  
  19.                     showObject(e);  
  20.          }  
  21.           
  22.          functionshowObject(obj){  
  23.                     //递归展现object  
  24.                     if(!obj){return;}  
  25.                              for(var i in obj){  
  26.                               if(typeof(obj[i])!=”object” ||obj[i]==null){  
  27.                                  document.write(i+ ” : ” + obj[i] + “<br/>”);  
  28.                               }   else{  
  29.                                  document.write(i+ ” : object” + “<br/>”);  
  30.                               }  
  31.                     }  
  32.          }  
  33.           
  34.          storage.setItem(“a”,5);  
  35.           
  36.          functionchangeS(){  
  37.                     //修改3个键值,测试storage事件  
  38.                     if(!storage.getItem(“b”)){storage.setItem(“b”,0);}  
  39.                            storage.setItem(‘b’,parseInt(storage.getItem(‘b’))+1);  
  40.          }  
  41.           
  42.          functionshowStorage(){  
  43.                     //循环呈现localStorage里的键值对  
  44.                     for(var i=0;i<storage.length;i++){  
  45.                               //key(i)得到相应的键,再用getItem()方法得到对应的值  
  46.                               document.write(storage.key(i)+ ” :” + storage.getItem(storage.key(i)) + “<br>”);  
  47.                     }  
  48.          }  
  49. </script>  
  50. </body>  

 

   
当运转这几个实例的时候,出现八个好奇的标题,正是别的浏览器幸好,在IE下报错,所以,那也终归他的多少个本性啊,它在IE、Firefox测试的时候要求把公文上传来服务器上(也许localhost),直接点开本地的HTML文件,是充足的,那里一定要注意。

    最终,那几个demo都有了,我们详细的讲一下它的部分性质:

澳门葡京 5

 

   
到此处,基本上基本的概念和总结的demo就都掌握了,现在亟待的就是把那个东西组成到一块儿,因为大家领略HTML五 LocalStorage不可能协理IE8以下的浏览器,不过考试系统运营的条件当先百分之五10都在IE八以下,所以大家要是想做三个包容性相比较好的地头存款和储蓄,就必要UserData和HTML5 LocalStorage连起来用,百二秦关终属楚,在落到实处的进程中,小编在网络找到了那般好的代码,究竟以落成程序为主,又好使的,还是用用好使的呢。下边是代码:

自个儿是借鉴的代码哦

   
不过那些文章里未有对命名空间给出代码,所以一直利用是有失水准的,供给投入命名空间的代码,以下是本人有点更动了须臾间,并且适应于考试系统的代码:

HTML5 LocalStorage   

   
可是,毕竟UserData有他的局限性,处于包容考虑,也在得以达成进度中传说了1种叫HTML5 LocalStorage 的东西。

要介绍HTML伍 LocalStorage,首先介绍一下地面存款和储蓄的野史:

澳门葡京 6

 

   
从此间能够看出来,本地存储一路从Cookies走到结尾,真心的不易于,那么,HTML伍 LocalStorage 具体有怎么样收益呢?

   
最早的Cookies自然是豪门都精通,难点主要正是太小,差不离也就4KB的样子,而且IE九只扶助每一个域名十多少个cookies,太少了。优势正是大家都协理,而且扶助得还蛮好。很早从前那多少个禁止使用cookies的用户也都逐步的不存在了,就接近从前禁用javascript的用户不设有了一如既往。

   
userData是IE的东西。未来用的最多的是Flash,空间是Cookie的2伍倍,基本够用。再然后谷歌推出了Gears,即便尚未限制,但不适的地点便是要装额外的插件。到了HTML五把这个都统一了,官方提出是各种网址5MB,十分大了,就存些字符串,丰裕了。比较奇特的是竟然全数协理的浏览器近年来都施用的伍MB,就算有一对浏览器能够让用户设置,但对于网页制小编来讲,近来的地貌就伍MB来思索是相比妥帖的。

    那么,有啥样浏览器支持她吗?

澳门葡京 7

 

   
所以依照图我们得以看来,手艺从而的浏览器都支持HTML伍 LocalStorage,所以,那也让本地存款和储蓄前途一片光明啊!

    上面写二个简练的实例: 

  1. <body>  
  2. <p>You have viewed this page <spanidspanid=”count”>0</span> time(s).</p>  
  3. <p><input type=”button”value=”changeStorage” onClick=”changeS()”/></p>  
  4. <script>  
  5.          varstorage = window.localStorage;  
  6.           
  7.          if(!storage.getItem(“pageLoadCount”))storage.setItem(“pageLoadCount”,0);  
  8.                    storage.pageLoadCount= parseInt(storage.getItem(“pageLoadCount”)) + 1;//必须格式调换  
  9.                    document.getElementById(“count”).innerHTML= storage.pageLoadCount;  
  10.                    showStorage();  
  11.                    if(window.addEventListener){  
  12.                     window.addEventListener(“storage”,handle_storage,false);  
  13.                    }elseif(window.attachEvent){  
  14.                     window.attachEvent(“onstorage”,handle_storage);  
  15.          }  
  16.           
  17.          functionhandle_storage(e){  
  18.                     if(!e){e=window.event;}  
  19.                     showObject(e);  
  20.          }  
  21.           
  22.          functionshowObject(obj){  
  23.                     //递归展现object  
  24.                     if(!obj){return;}  
  25.                              for(var i in obj){  
  26.                               if(typeof(obj[i])!=”object” ||obj[i]==null){  
  27.                                  document.write(i+ ” : ” + obj[i] + “<br/>”);  
  28.                               }   else{  
  29.                                  document.write(i+ ” : object” + “<br/>”);  
  30.                               }  
  31.                     }  
  32.          }  
  33.           
  34.          storage.setItem(“a”,5);  
  35.           
  36.          functionchangeS(){  
  37.                     //修改一个键值,测试storage事件  
  38.                     if(!storage.getItem(“b”)){storage.setItem(“b”,0);}  
  39.                            storage.setItem(‘b’,parseInt(storage.getItem(‘b’))+1);  
  40.          }  
  41.           
  42.          functionshowStorage(){  
  43.                     //循环展现localStorage里的键值对  
  44.                     for(var i=0;i<storage.length;i++){  
  45.                               //key(i)获得相应的键,再用getItem()方法获得相应的值  
  46.                               document.write(storage.key(i)+ ” :” + storage.getItem(storage.key(i)) + “<br>”);  
  47.                     }  
  48.          }  
  49. </script>  
  50. </body>  

 

   
当运营这些实例的时候,出现三个古怪的主题材料,正是其他浏览器辛亏,在IE下报错,所以,那也毕竟他的贰个个性啊,它在IE、Firefox测试的时候供给把公文上传到服务器上(也许localhost),直接点开本地的HTML文件,是十分的,那里一定要注意。

    最终,那些demo都有了,我们详细的讲一下它的部分性质:

澳门葡京 8

 

   
到此处,基本上基本的概念和省略的demo就都领悟了,未来亟待的正是把那几个东西组成到一块,因为大家精通HTML伍 LocalStorage无法帮忙IE八以下的浏览器,不过考试系统运行的条件大多数都在IE8以下,所以我们假使想做三个包容性相比好的地头存储,就需求UserData和HTML伍 LocalStorage连起来用,皇天不负有心人,在落实的长河中,笔者在网上找到了这般好的代码,毕竟以完毕程序为主,又好使的,如故用用好使的呢。上边是代码:

笔者是以史为鉴的代码哦

   
可是那么些稿子里从未对命名空间给出代码,所以直接使用是不平常的,须求投入命名空间的代码,以下是本人有点更改了一晃,并且适应于考试系统的代码:

完整的demo

   
HTML代码(注意,一定要放在服务器上运转,IIS,TOMCAL,JBOSS都足以,不要直接点击运营):

  1. <!DOCTYPE html PUBLIC “-//W3C//DTDXHTML 1.0 Transitional//EN””;  
  2. <htmlxmlnshtmlxmlns=”;  
  3. <head>  
  4. <metahttp-equivmetahttp-equiv=”Content-Type” content=”text/html;charset=gb2312″ />  
  5.    
  6. <title>无标题文书档案</title>  
  7.  <script type=”text/javascript”src=”js/jquery-1.4.2.min.js”></script>  
  8.    <script type=”text/javascript” src=”js/jquery.utils.js”></script>  
  9.  <script type=”text/javascript”src=”js/localstorage.js”></script>  
  10.    
  11.    
  12. <script>  
  13. function saveStu(){  
  14.          qext.LocalStorage.save(“2344234″,”234″,”234234″,”234234”);  
  15. }  
  16.    
  17.  function saveMore(){  
  18. // 保存多个目的  
  19. qext.LocalStorage.set([{  
  20.   key : “username”,  
  21.   value : “{  ‘sitename’: ‘K JSON’, ‘siteurl’: ‘www.kjson.com’, ‘keyword’: ‘JSON在线校验,格式化JSON,json 在线校验’}”,  
  22.    
  23.   expires : 3600 * 1000  /*单位:ms*/  
  24. },{  
  25.   key : “password”,  
  26.   value : “zxlie”,  
  27.   expires : 3600 * 1000  /*单位:ms*/  
  28. }]);  
  29. }   
  30. function show(){  
  31.          //获取某二个地面存储,重回值为:{key:””,value:””,expires:””},未取到值时重临值为:null  
  32.  varrst = qext.LocalStorage.get({  
  33.    key : “2344234234234234”  
  34.  });  
  35.  alert(rst);  
  36. }  
  37. function getMore(){  
  38.          vararrGet = qext.LocalStorage.getAllKeys();  
  39.          for(vari=0;i<arrGet.length;i++){  
  40.                    varrst = qext.LocalStorage.get({  
  41.                        key : arrGet[i]  
  42.                     });  
  43.                     alert(rst);  
  44.          }  
  45. }  
  46. function removeOne(){  
  47.          qext.LocalStorage.remove({  
  48.                     key : “2344234234234”  
  49.          })  
  50. }  
  51.    
  52. </script>  
  53. </head>  
  54.    
  55. <body>  
  56. <input type=”button”onclick=”saveStu()” value=”保存数据” />  
  57. <input type=”button”onclick=”show()” value=”显示数据” />  
  58. <input type=”button”onclick=”getMore()” value=”显示整个数据” />  
  59. <input type=”button”onclick=”removeOne()” value=”移除二个数码” />  
  60. </body>  
  61. </html>  

 

JS代码:

  1. /**  
  2.  * 注册命名空间  
  3.  *@param {String} fullNS 完整的命名空间字符串,如qui.dialog  
  4.  *@param {Boolean} isIgnorSelf 是还是不是忽略自个儿,默以为false,不忽视  
  5.  *@author   
  6.  *@example  
  7.  *     window.registNS(“QingFeed.Text.Bold”);  
  8.  */  
  9. window.registNS =function(fullNS,isIgnorSelf){  
  10.    //命名空间合法性校验依附  
  11.    var reg = /^[_$a-z]+[_$a-z0-9]*/i;  
  12.           
  13.    // 将命名空间切成N部分, 举例baidu.libs.Firefox等  
  14.    var nsArray = fullNS.split(‘.’);  
  15.    var sEval = “”;  
  16.    var sNS = “”;  
  17.    var n = isIgnorSelf ? nsArray.length – 1 : nsArray.length;  
  18.    for (var i = 0; i < n; i++){  
  19.        //命名空间合法性校验  
  20.         if(!reg.test(nsArray[i])) {  
  21.            throw new Error(“Invalid namespace:” + nsArray[i] +””);  
  22.            return ;  
  23.        }  
  24.        if (i != 0) sNS += “.”;  
  25.        sNS += nsArray[i];  
  26.        // 依次创造布局命名空间对象(假若不设有的话)的语句  
  27.        sEval += “if(typeof(” + sNS + “)==’undefined’) ” +sNS + “=new Object();else ” + sNS + “;”;  
  28.     }  
  29.    //生成命名空间  
  30.    if (sEval != “”) {  
  31.        return eval(sEval);  
  32.     }  
  33.    return {};  
  34. };  
  35.    
  36.    
  37. /**  
  38.  * 注册命名空间  
  39.  */  
  40. window.registNS(‘qext’);  
  41.    
  42. /**  
  43.  *@class qext.LocalStorage  
  44.  * 跨浏览器的地面存款和储蓄达成。高端浏览器选用localstorage,ie使用UserData。纵然身为本地存款和储蓄,也请不要存款和储蓄过大数量,最佳不用超过64K.  
  45.  * 因为ie下UserData每页最大存款和储蓄是6四k。  
  46.  *@singleton  
  47.  *@author zhaoxianlie ([email protected])  
  48.  */  
  49. (function(){  
  50.    /**  
  51.     * 验证字符串是还是不是合法的键名  
  52.     * @param {Object} key 待验证的key  
  53.     * @return {Boolean} true:合法,false:不合法  
  54.     * @private  
  55.     */  
  56.    function _isValidKey(key) {  
  57.        return (newRegExp(“^[^\\x00-\\x20\\x7f\\(\\)<>@,;:\\\\\\\”\\[\\]\\?=\\{\\}\\/\\u0080-\\uffff]+\x24”)).test(key);  
  58.     }  
  59.      
  60.    //所有的key  
  61.    var _clearAllKey = “_baidu.ALL.KEY_”;  
  62.      
  63.    /**  
  64.     * 创造并赢得这一个input:hidden实例  
  65.     * @return {HTMLInputElement} input:hidden实例  
  66.     * @private  
  67.     */  
  68.    function _getInstance(){  
  69.        //把UserData绑定到input:hidden上  
  70.        var _input = null;  
  71.        //是的,不要惊讶,那里每一次都会成立二个input:hidden并扩大到DOM树种  
  72.        //目标是防止数据被另行写入,提早产生“磁盘空间写满”的Exception  
  73.        _input = document.createElement(“input”);  
  74.        _input.type = “hidden”;  
  75.        _input.addBehavior(“#default#userData”);  
  76.        document.body.appendChild(_input);  
  77.        return _input;  
  78.     }  
  79.      
  80.    /**  
  81.     * 将数据经过UserData的形式保留到地面,文件名称为:文件名称为:config.key[1].xml  
  82.     * @param {String} key 待存款和储蓄数据的key,和config参数中的key是同壹的  
  83.     * @param {Object} config 待存款和储蓄数据相关布署  
  84.     * @cofnig {String} key 待存款和储蓄数据的key  
  85.     * @config {String} value 待存款和储蓄数据的内容  
  86.     * @config {String|Object} [expires] 数据的过期时间,能够是数字,单位是阿秒;也得以是日期对象,表示过期时间  
  87.     * @private  
  88.     */  
  89.    function __setItem(key,config){  
  90.        try {  
  91.            var input = _getInstance();  
  92.            //创建贰个Storage对象  
  93.            var storageInfo = config || {};  
  94.            //设置过期时间  
  95.            if(storageInfo.expires) {  
  96.                 var expires;  
  97.                 //假使设置项里的expires为数字,则代表数据的能存活的皮秒数  
  98.                 if (‘number’ == typeofstorageInfo.expires) {  
  99.                    expires = new Date();  
  100.                    expires.setTime(expires.getTime() + storageInfo.expires);  
  101.                 }  
  102.                 input.expires =expires.toUTCString();  
  103.            }  
  104.              
  105.            //存款和储蓄数据  
  106.            input.setAttribute(storageInfo.key,storageInfo.value);  
  107.            //存款和储蓄到地面文件,文件名称为:storageInfo.key[1].xml  
  108.            input.save(storageInfo.key);  
  109.        } catch (e) {  
  110.        }  
  111.     }  
  112.    
  113.    /**  
  114.     * 将数据通过UserData的格局保存到地点,文件名称叫:文件名称叫:config.key[1].xml  
  115.     * @param {String} key 待存款和储蓄数据的key,和config参数中的key是均等的  
  116.     * @param {Object} config 待存款和储蓄数占领关配置  
  117.     * @cofnig {String} key 待存款和储蓄数据的key  
  118.     * @config {String} value 待存款和储蓄数据的内容  
  119.     * @config {String|Object} [expires] 数据的逾期时间,能够是数字,单位是阿秒;也得以是日期对象,表示过期时间  
  120.     * @private  
  121.     */  
  122.    function _setItem(key,config){  
  123.        //保存有效内容  
  124.        __setItem(key,config);  
  125.          
  126.        //下边包车型大巴代码用来记录当前封存的key,便于现在clearAll  
  127.        var result = _getItem({key : _clearAllKey});  
  128.        if(result) {  
  129.            result = {  
  130.                key : _clearAllKey,  
  131.                 value : result  
  132.            };  
  133.        } else {  
  134.            result = {  
  135.                 key : _clearAllKey,  
  136.                 value : “”  
  137.            };  
  138.        }  
  139.          
  140.        if(!(new RegExp(“(^|\\|)” + key + “(\\||$)”,’g’)).test(result.value)){  
  141.            result.value += “|” + key;  
  142.            //保存键  
  143.            __setItem(_clearAllKey,result);      
  144.        }  
  145.     }  
  146.      
  147.    /**  
  148.     * 提取当地存储的数目  
  149.     * @param {String} config 待获取的仓库储存数据有关布署  
  150.     * @cofnig {String} key 待获取的数量的key  
  151.     * @return {String} 本地存款和储蓄的数码,获取不到时回来null  
  152.     * @example  
  153.     * qext.LocalStorage.get({  
  154.     *      key : “username”  
  155.     * });  
  156.     * @private  
  157.     */  
  158.    function _getItem(config){  
  159.        try {  
  160.            var input = _getInstance();  
  161.            //载入当麻芋果件,文件名叫:config.key[1].xml  
  162.            input.load(config.key);  
  163.            //获得数据  
  164.            return input.getAttribute(config.key) || null;  
  165.        } catch (e) {  
  166.            return null;             
  167.        }  
  168.     }  
  169.      
  170.    /**  
  171.     * 移除某项存款和储蓄数据  
  172.     * @param {Object} config 配置参数  
  173.     * @cofnig {String} key 待存款和储蓄数据的key  
  174.     * @private  
  175.     */  
  176.    function _removeItem(config){  
  177.                    try{  
  178.                             varinput = _getInstance();  
  179.                             //载入存款和储蓄区块  
  180.                             input.load(config.key);  
  181.                             //移除配置项  
  182.                             input.removeAttribute(config.key);  
  183.                             //强制使其逾期  
  184.                             varexpires = new Date();  
  185.                             expires.setTime(expires.getTime()- 1);  
  186.                             input.expires= expires.toUTCString();  
  187.                             input.save(config.key);  
  188.                              
  189.                             //从allkey中剔除当前key                        
  190.                             //下边包车型大巴代码用来记录当前保存的key,便于以往clearAll  
  191.                             var result = _getItem({key :_clearAllKey});  
  192.                             if(result){  
  193.                                      result= result.replace(new RegExp(“(^|\\|)” + config.key +”(\\||$)”,’g’),”);  
  194.                                      result= {  
  195.                                                key: _clearAllKey,  
  196.                                                value: result  
  197.                                      };  
  198.                                      //保存键  
  199.                                      __setItem(_clearAllKey,result);        
  200.                             }  
  201.                              
  202.                    }catch (e) {  
  203.                    }  
  204.          }  
  205.      
  206.    //移除具有的地点数据  
  207.    function _clearAll(){  
  208.        result = _getItem({key : _clearAllKey});  
  209.        if(result) {  
  210.            var allKeys = result.split(“|”);  
  211.            var count = allKeys.length;  
  212.            for(var i = 0;i < count;i++){  
  213.                 if(!!allKeys[i]) {  
  214.                    _removeItem({key:allKeys[i]});  
  215.                 }  
  216.            }  
  217.        }  
  218.     }  
  219.      
  220.      
  221.    /**  
  222.     * 获取具备的地头存款和储蓄数据对应的key  
  223.     * @return {Array} 所有的key  
  224.     * @private  
  225.     */  
  226.    function _getAllKeys(){  
  227.        var result = [];  
  228.        var keys = _getItem({key : _clearAllKey});  
  229.        if(keys) {  
  230.            keys = keys.split(‘|’);  
  231.            for(var i = 0,len = keys.length;i < len;i++){  
  232.                 if(!!keys[i]) {  
  233.                     result.push(keys[i]);  
  234.                 }  
  235.            }  
  236.        }  
  237.        return result ;  
  238.     }  
  239.      
  240.    /**  
  241.     * 判定当前浏览器是还是不是协理地方存款和储蓄:window.localStorage  
  242.     * @return {Boolean} true:支持;false:不支持  
  243.     * @remark 支持地点存款和储蓄的浏览器:IE八+、Firefox三.0+、Opera拾.五+、Chrome四.0+、Safari4.0+、三星2.0+、Andrioid2.0+  
  244.     * @private  
  245.     */  
  246.    var _isSupportLocalStorage = ((‘localStorage’ in window) &&(window[‘localStorage’] !== null)),  
  247.        _isSupportUserData = !!jQuery.browser.ie;  
  248.      
  249.    qext.LocalStorage = {  
  250.        /**  
  251.         * 要是扶助本地存款和储蓄,再次来到true;不然再次来到false  
  252.         * @type Boolean  
  253.         */  
  254.        isAvailable : _isSupportLocalStorage || _isSupportUserData,  
  255.          
  256.        /**  
  257.         * 将数据举办地面存款和储蓄(只好存款和储蓄字符串音信)  
  258.         * <pre><code>  
  259.                     * //保存单个对象  
  260.                     * qext.LocalStorage.set({  
  261.                     *             key: “username”,  
  262.                     *             value: “baiduie”,  
  263.                     *             expires: 3600 * 1000  
  264.                     * });  
  265.                     * //保存对个目标  
  266.                     * qext.LocalStorage.set([{  
  267.                     *             key: “username”,  
  268.                     *             value: “baiduie”,  
  269.                     *             expires: 3600 * 1000  
  270.                     * },{  
  271.                     *             key: “password”,  
  272.                     *             value: “zxlie”,  
  273.                     *             expires: 3600 * 1000  
  274.                     * }]);  
  275.         * </code></pre>  
  276.         * @param {Object} obj 待存储数据相关安顿,能够是单个JSON对象,也足以是由七个JSON对象组成的数组  
  277.         * <ul>  
  278.         * <li><b>key</b> : String <divclassdivclass=”sub-desc”>待存储数据的key,务必将key值起的错综复杂一些,如:baidu.username</div></li>  
  279.         * <li><b>value</b> : String <divclassdivclass=”sub-desc”>待存款和储蓄数据的内容</div></li>  
  280.         * <li><b>expires</b> : String/Object (Optional)<divclassdivclass=”sub-desc”>数据的过期时间,能够是数字,单位是皮秒;也足以是日期对象,表示过期时间</div></li>  
  281.         * </ul>  
  282.         */  
  283.        set : function(obj){  
  284.                             //保存单个对象  
  285.                             var_set_ = function(config){  
  286.                                      //key校验  
  287.                                      if(!_isValidKey(config.key)){return;}  
  288.    
  289.                                      //待存款和储蓄的数目  
  290.                                      varstorageInfo = config || {};  
  291.                                       
  292.                                      //援助地点存款和储蓄的浏览器:IE捌+、Firefox三.0+、Opera十.5+、Chrome四.0+、Safari四.0+、小米二.0+、Andrioid2.0+  
  293.                                      if(_isSupportLocalStorage){  
  294.                                                window.localStorage.setItem(storageInfo.key,storageInfo.value);  
  295.                                                if(config.expires){  
  296.                         var expires;  
  297.                         //假若设置项里的expires为数字,则表示数据的能存活的纳秒数  
  298.                         if (‘number’ == typeofstorageInfo.expires) {  
  299.                             expires = newDate();  
  300.                            expires.setTime(expires.getTime() + storageInfo.expires);  
  301.                         }  
  302.    
  303.                        window.localStorage.setItem(storageInfo.key +”.expires”,expires);  
  304.                                                }  
  305.                                      }else if(_isSupportUserData) { //IE七及以下版本,采取UserData格局  
  306.                                                _setItem(config.key,storageInfo);  
  307.                                      }         
  308.                             };  
  309.    
  310.                             //决断传入的参数是还是不是为数组  
  311.                             if(obj&& obj.constructor === Array && obj instanceof Array){  
  312.                                      for(vari = 0,len = obj.length;i < len;i++){  
  313.                                                _set_(obj[i]);  
  314.                                      }  
  315.                             }elseif(obj){  
  316.                                      _set_(obj);  
  317.                             }  
  318.        },  
  319.                     
  320.                    /**  
  321.                     * 提取当地存款和储蓄的数量  
  322.         * <pre><code>  
  323.                     * //获取某2个地面存储,再次来到值为:{key:””,value:””,expires:””},未取到值时重回值为:null  
  324.                     * var rst = qext.LocalStorage.get({  
  325.                     *             key: “username”  
  326.                     * });  
  327.                     * //获取八个地面存款和储蓄,再次来到值为:[“”,””,””],未取到值时再次回到值为:[null,null,null]  
  328.                     * qext.LocalStorage.get([{  
  329.                     *             key: “username”  
  330.                     * },{  
  331.                     *             key: “password”  
  332.                     * },{  
  333.                     *             key: “sex”  
  334.                     * }]);  
  335.         * </code></pre>  
  336.                     * @param {String} obj 待获取的蕴藏数据相关配置,援助单个对象传入,同样也支撑两个目的封装的数组格式  
  337.                     * @config {String} key 待存款和储蓄数据的key  
  338.                     * @return {String} 本地存储的数量,传入为单个对象时,重临单个对象,获取不到时回来null;传入为数组时,重返为数组  
  339.                     */  
  340.        get : function(obj){  
  341.                             //获取某三个本地存储  
  342.                             var_get_ = function(config){  
  343.                                      //结果       
  344.                                      varresult = null;  
  345.                                      if(typeofconfig === “string”) config = {key : config};  
  346.                                      //key校验  
  347.                                      if(!_isValidKey(config.key)){return result;}  
  348.                                       
  349.                                      //扶助本地存款和储蓄的浏览器:IE捌+、Firefox三.0+、Opera十.五+、Chrome4.0+、Safari4.0+、魅族2.0+、Andrioid贰.0+  
  350.                                      if(_isSupportLocalStorage){  
  351.                                                result= window.localStorage.getItem(config.key);  
  352.                                                //过期时间决断,即使过期了,则移除该项  
  353.                                                if(result){  
  354.                                                         varexpires = window.localStorage.getItem(config.key + “.expires”);  
  355.                                                         result= {  
  356.                                                                  value: result,  
  357.                                                                  expires: expires ? new Date(expires) : null  
  358.                                                         };  
  359.                                                         if(result&& result.expires && result.expires < new Date()) {  
  360.                                                                  result= null;  
  361.                                                                  window.localStorage.removeItem(config.key);  
  362.                            window.localStorage.removeItem(config.key + “.expires”);  
  363.                                                         }  
  364.                                                }  
  365.                                      }else if(_isSupportUserData) { //IE7及以下版本,采取UserData格局  
  366.                                                //那里不用单独判别其expires,因为UserData自个儿持有那一个论断  
  367.                                                result= _getItem(config);  
  368.                                                if(result){  
  369.                                                         result= { value : result };  
  370.                                                }  
  371.                                      }  
  372.                                       
  373.                                      returnresult ? result.value : null;  
  374.                             };  
  375.                              
  376.                             varrst = null;  
  377.                             //判定传入的参数是还是不是为数组  
  378.                             if(obj&& obj.constructor === Array && obj instanceof Array){  
  379.                                      rst= [];  
  380.                                      for(vari = 0,len = obj.length;i < len;i++){  
  381.                                                rst.push(_get_(obj[i]));  
  382.                                      }  
  383.                             }elseif(obj){  
  384.                                      rst= _get_(obj);  
  385.                             }  
  386.                             returnrst;  
  387.        },  
  388.          
  389.        /**  
  390.         * 移除某1项地方存款和储蓄的数额  
  391.         * <pre><code>  
  392.                     * //删除三个本地存款和储蓄项  
  393.                     * qext.LocalStorage.remove({  
  394.                     *             key: “username”  
  395.                     * });  
  396.                     * //删除多少个地面存款和储蓄项目 *  
  397.                     * qext.LocalStorage.remove([{  
  398.                     *             key: “username”  
  399.                     * },{  
  400.                     *             key: “password”  
  401.                     * },{  
  402.                     *             key: “sex”  
  403.                     * }]);  
  404.         * </code></pre>  
  405.                     * @param {String} obj 待移除的囤积数据相关安插,支持移除某3个本土存款和储蓄,也支撑数组方式的批量移除  
  406.                     * @config {String} key 待移除数据的key  
  407.                     * @return 无  
  408.         */  
  409.        remove : function(obj){  
  410.                             //移除某壹项地点存款和储蓄的数额  
  411.                             var_remove_ = function(config){  
  412.                                      //帮助地方存款和储蓄的浏览器:IE八+、Firefox三.0+、Opera10.伍+、Chrome肆.0+、Safari肆.0+、索爱二.0+、Andrioid二.0+  
  413.                                      if(_isSupportLocalStorage){  
  414.                                                window.localStorage.removeItem(config.key);  
  415.                                                window.localStorage.removeItem(config.key+ “.expires”);  
  416.                                      }else if(_isSupportUserData){ //IE柒及以下版本,选取UserData方式  
  417.                                                _removeItem(config);  
  418.                                      }  
  419.                             };  
  420.                              
  421.                             //推断传入的参数是还是不是为数组  
  422.                             if(obj&& obj.constructor === Array && obj instanceof Array){  
  423.                                      for(vari = 0,len = obj.length;i < len;i++){  
  424.                                                _remove_(obj[i]);  
  425.                                      }  
  426.                             }elseif(obj){  
  427.                                      _remove_(obj);  
  428.                             }  
  429.        },  
  430.          
  431.        /**  
  432.         * 清除全部地方存款和储蓄的多寡  
  433.         * <pre><code>  
  434.         * qext.LocalStorage.clearAll();  
  435.         * </code></pre>  
  436.         */  
  437.        clearAll : function(){  
  438.            //支持本地存款和储蓄的浏览器:IE捌+、Firefox3.0+、Opera拾.5+、Chrome四.0+、Safari四.0+、BlackBerry贰.0+、Andrioid二.0+  
  439.            if(_isSupportLocalStorage) {  
  440.                 window.localStorage.clear();  
  441.            } else if(_isSupportUserData) { //IE7及以下版本,选取UserData情势  
  442.                 _clearAll();  
  443.            }  
  444.        },  
  445.          
  446.        //保存单个对象到地头  
  447.        save:function(StudentID,ExamID,QuestionID,ExamAnswer){  
  448.        qext.LocalStorage.set({  
  449.           key : StudentID+ExamID+QuestionID,  
  450.           value : “{  StudentID’: ‘”+StudentID+”’,‘ExamID’: ‘”+ExamID+”’, ‘QuestionID’:‘”+QuestionID+”’,‘ExamAnswer’: ‘”+ExamAnswer+”’}”,  
  451.           expires : 3600 * 1000  /*单位:ms*/  
  452.        });  
  453.        },  
  454.        /**  
  455.         * 获取具备的本地存款和储蓄数据对应的key  
  456.         * <pre><code>  
  457.         * var keys = qext.LocalStorage.getAllKeys();  
  458.         * </code></pre>  
  459.         * @return {Array} 所有的key  
  460.         */  
  461.        getAllKeys : function(){  
  462.            var result = [];  
  463.            //支持当地存款和储蓄的浏览器:IE捌+、Firefox叁.0+、Opera10.伍+、Chrome肆.0+、Safari四.0+、魅族二.0+、Andrioid贰.0+  
  464.            if(_isSupportLocalStorage) {  
  465.                 var key;  
  466.                 for(var i = 0,len =window.localStorage.length;i < len;i++){  
  467.                     key = window.localStorage.key(i);  
  468.                    if(!/.+\.expires$/.test(key)) {  
  469.                         result.push(key);  
  470.                     }  
  471.                 }  
  472.            } else if(_isSupportUserData) { //IE七及以下版本,采纳UserData方式  
  473.                 result = _getAllKeys();  
  474.            }  
  475.              
  476.            return result;  
  477.        }  
  478.    };  
  479.    
  480. })();  

 

挺钦佩封装这么些代码的人,认为无论从编制程序习贯依然代码的成色上都值得每一位学习,所以,推荐一下。

到此,全体的本地存款和储蓄的难题都化解了,又是1揽子的一天!

上边是一个总体的次序:作者是共同体的次序

参照博客:

完整的demo

   
HTML代码(注意,一定要放在服务器上运转,IIS,TOMCAL,JBOSS都能够,不要直接点击运营): 

  1. <!DOCTYPE html PUBLIC “-//W3C//DTDXHTML 1.0 Transitional//EN””;  
  2. <htmlxmlnshtmlxmlns=”;  
  3. <head>  
  4. <metahttp-equivmetahttp-equiv=”Content-Type” content=”text/html;charset=gb2312″ />  
  5.    
  6. <title>无题目文书档案</title>  
  7.  <script type=”text/javascript”src=”js/jquery-1.4.2.min.js”></script>  
  8.    <script type=”text/javascript” src=”js/jquery.utils.js”></script>  
  9.  <script type=”text/javascript”src=”js/localstorage.js”></script>  
  10.    
  11.    
  12. <script>  
  13. function saveStu(){  
  14.          qext.LocalStorage.save(“2344234″,”234″,”234234″,”234234”);  
  15. }  
  16.    
  17.  function saveMore(){  
  18. // 保存多少个目的  
  19. qext.LocalStorage.set([{  
  20.   key : “username”,  
  21.   value : “{  ‘sitename’: ‘K JSON’, ‘siteurl’: ‘www.kjson.com’, ‘keyword’: ‘JSON在线校验,格式化JSON,json 在线校验’}”,  
  22.    
  23.   expires : 3600 * 1000  /*单位:ms*/  
  24. },{  
  25.   key : “password”,  
  26.   value : “zxlie”,  
  27.   expires : 3600 * 1000  /*单位:ms*/  
  28. }]);  
  29. }   
  30. function show(){  
  31.          //获取某两个地点存款和储蓄,重回值为:{key:””,value:””,expires:””},未取到值时再次来到值为:null  
  32.  varrst = qext.LocalStorage.get({  
  33.    key : “2344234234234234”  
  34.  });  
  35.  alert(rst);  
  36. }  
  37. function getMore(){  
  38.          vararrGet = qext.LocalStorage.getAllKeys();  
  39.          for(vari=0;i<arrGet.length;i++){  
  40.                    varrst = qext.LocalStorage.get({  
  41.                        key : arrGet[i]  
  42.                     });  
  43.                     alert(rst);  
  44.          }  
  45. }  
  46. function removeOne(){  
  47.          qext.LocalStorage.remove({  
  48.                     key : “2344234234234”  
  49.          })  
  50. }  
  51.    
  52. </script>  
  53. </head>  
  54.    
  55. <body>  
  56. <input type=”button”onclick=”saveStu()” value=”保存数据” />  
  57. <input type=”button”onclick=”show()” value=”突显数据” />  
  58. <input type=”button”onclick=”getMore()” value=”展现任何数码” />  
  59. <input type=”button”onclick=”removeOne()” value=”移除1个数量” />  
  60. </body>  
  61. </html>  

 

JS代码: 

  1. /**  
  2.  * 注册命名空间  
  3.  *@param {String} fullNS 完整的命名空间字符串,如qui.dialog  
  4.  *@param {Boolean} isIgnorSelf 是或不是忽略自身,私下认可为false,不忽视  
  5.  *@author   
  6.  *@example  
  7.  *     window.registNS(“QingFeed.Text.Bold”);  
  8.  */  
  9. window.registNS =function(fullNS,isIgnorSelf){  
  10.    //命名空间合法性校验依附  
  11.    var reg = /^[_$a-z]+[_$a-z0-9]*/i;  
  12.           
  13.    // 将命名空间切成N部分, 举个例子baidu.libs.Firefox等  
  14.    var nsArray = fullNS.split(‘.’);  
  15.    var sEval = “”;  
  16.    var sNS = “”;  
  17.    var n = isIgnorSelf ? nsArray.length – 1 : nsArray.length;  
  18.    for (var i = 0; i < n; i++){  
  19.        //命名空间合法性校验  
  20.         if(!reg.test(nsArray[i])) {  
  21.            throw new Error(“Invalid namespace:” + nsArray[i] +””);  
  22.            return ;  
  23.        }  
  24.        if (i != 0) sNS += “.”;  
  25.        sNS += nsArray[i];  
  26.        // 依次创制布局命名空间对象(若是不存在的话)的讲话  
  27.        sEval += “if(typeof(” + sNS + “)==’undefined’) ” +sNS + “=new Object();else ” + sNS + “;”;  
  28.     }  
  29.    //生成命名空间  
  30.    if (sEval != “”) {  
  31.        return eval(sEval);  
  32.     }  
  33.    return {};  
  34. };  
  35.    
  36.    
  37. /**  
  38.  * 注册命名空间  
  39.  */  
  40. window.registNS(‘qext’);  
  41.    
  42. /**  
  43.  *@class qext.LocalStorage  
  44.  * 跨浏览器的本土存储完毕。高端浏览器采取localstorage,ie使用UserData。固然身为本地存款和储蓄,也请不要存储过大数目,最佳不用超过64K.  
  45.  * 因为ie下UserData每页最大存款和储蓄是6四k。  
  46.  *@singleton  
  47.  *@author zhaoxianlie ([email protected])  
  48.  */  
  49. (function(){  
  50.    /**  
  51.     * 验证字符串是或不是合法的键名  
  52.     * @param {Object} key 待验证的key  
  53.     * @return {Boolean} true:合法,false:不合法  
  54.     * @private  
  55.     */  
  56.    function _isValidKey(key) {  
  57.        return (newRegExp(“^[^\\x00-\\x20\\x7f\\(\\)<>@,;:\\\\\\\”\\[\\]\\?=\\{\\}\\/\\u0080-\\uffff]+\x24”)).test(key);  
  58.     }  
  59.      
  60.    //所有的key  
  61.    var _clearAllKey = “_baidu.ALL.KEY_”;  
  62.      
  63.    /**  
  64.     * 创设并得到那一个input:hidden实例  
  65.     * @return {HTMLInputElement} input:hidden实例  
  66.     * @private  
  67.     */  
  68.    function _getInstance(){  
  69.        //把UserData绑定到input:hidden上  
  70.        var _input = null;  
  71.        //是的,不要奇异,那里每趟都会成立三个input:hidden并追加到DOM树种  
  72.        //目标是制止数据被另行写入,提早产生“磁盘空间写满”的Exception  
  73.        _input = document.createElement(“input”);  
  74.        _input.type = “hidden”;  
  75.        _input.addBehavior(“#default#userData”);  
  76.        document.body.appendChild(_input);  
  77.        return _input;  
  78.     }  
  79.      
  80.    /**  
  81.     * 将数据通过UserData的章程保留到地面,文件名称为:文件名字为:config.key[1].xml  
  82.     * @param {String} key 待存款和储蓄数据的key,和config参数中的key是均等的  
  83.     * @param {Object} config 待存款和储蓄数据有关布置  
  84.     * @cofnig {String} key 待存款和储蓄数据的key  
  85.     * @config {String} value 待存储数据的内容  
  86.     * @config {String|Object} [expires] 数据的逾期时间,可以是数字,单位是皮秒;也得以是日期对象,表示过期时间  
  87.     * @private  
  88.     */  
  89.    function __setItem(key,config){  
  90.        try {  
  91.            var input = _getInstance();  
  92.            //创制1个Storage对象  
  93.            var storageInfo = config || {};  
  94.            //设置过期时间  
  95.            if(storageInfo.expires) {  
  96.                 var expires;  
  97.                 //若是设置项里的expires为数字,则象征数据的能存活的皮秒数  
  98.                 if (‘number’ == typeofstorageInfo.expires) {  
  99.                    expires = new Date();  
  100.                    expires.setTime(expires.getTime() + storageInfo.expires);  
  101.                 }  
  102.                 input.expires =expires.toUTCString();  
  103.            }  
  104.              
  105.            //存储数据  
  106.            input.setAttribute(storageInfo.key,storageInfo.value);  
  107.            //存款和储蓄到地点文件,文件名称为:storageInfo.key[1].xml  
  108.            input.save(storageInfo.key);  
  109.        } catch (e) {  
  110.        }  
  111.     }  
  112.    
  113.    /**  
  114.     * 将数据经过UserData的秘诀保留到本地,文件名字为:文件名叫:config.key[1].xml  
  115.     * @param {String} key 待存款和储蓄数据的key,和config参数中的key是一模同样的  
  116.     * @param {Object} config 待存款和储蓄数据相关布署  
  117.     * @cofnig {String} key 待存储数据的key  
  118.     * @config {String} value 待存储数据的内容  
  119.     * @config {String|Object} [expires] 数据的晚点时间,能够是数字,单位是阿秒;也得以是日期对象,表示过期时间  
  120.     * @private  
  121.     */  
  122.    function _setItem(key,config){  
  123.        //保存有效内容  
  124.        __setItem(key,config);  
  125.          
  126.        //下边包车型地铁代码用来记录当前封存的key,便于未来clearAll  
  127.        var result = _getItem({key : _clearAllKey});  
  128.        if(result) {  
  129.            result = {  
  130.                key : _clearAllKey,  
  131.                 value : result  
  132.            };  
  133.        } else {  
  134.            result = {  
  135.                 key : _clearAllKey,  
  136.                 value : “”  
  137.            };  
  138.        }  
  139.          
  140.        if(!(new RegExp(“(^|\\|)” + key + “(\\||$)”,’g’)).test(result.value)){  
  141.            result.value += “|” + key;  
  142.            //保存键  
  143.            __setItem(_clearAllKey,result);      
  144.        }  
  145.     }  
  146.      
  147.    /**  
  148.     * 提取本地存款和储蓄的数据  
  149.     * @param {String} config 待获取的积攒数据相关安插  
  150.     * @cofnig {String} key 待获取的多寡的key  
  151.     * @return {String} 本地存款和储蓄的数量,获取不到时再次来到null  
  152.     * @example  
  153.     * qext.LocalStorage.get({  
  154.     *      key : “username”  
  155.     * });  
  156.     * @private  
  157.     */  
  158.    function _getItem(config){  
  159.        try {  
  160.            var input = _getInstance();  
  161.            //载入当麻芋果件,文件名称叫:config.key[1].xml  
  162.            input.load(config.key);  
  163.            //获得数据  
  164.            return input.getAttribute(config.key) || null;  
  165.        } catch (e) {  
  166.            return null;             
  167.        }  
  168.     }  
  169.      
  170.    /**  
  171.     * 移除某项存款和储蓄数据  
  172.     * @param {Object} config 配置参数  
  173.     * @cofnig {String} key 待存储数据的key  
  174.     * @private  
  175.     */  
  176.    function _removeItem(config){  
  177.                    try{  
  178.                             varinput = _getInstance();  
  179.                             //载入存款和储蓄区块  
  180.                             input.load(config.key);  
  181.                             //移除配置项  
  182.                             input.removeAttribute(config.key);  
  183.                             //强制使其逾期  
  184.                             varexpires = new Date();  
  185.                             expires.setTime(expires.getTime()- 1);  
  186.                             input.expires= expires.toUTCString();  
  187.                             input.save(config.key);  
  188.                              
  189.                             //从allkey中删除当前key                        
  190.                             //下边包车型客车代码用来记录当前保存的key,便于以往clearAll  
  191.                             var result = _getItem({key :_clearAllKey});  
  192.                             if(result){  
  193.                                      result= result.replace(new RegExp(“(^|\\|)” + config.key +”(\\||$)”,’g’),”);  
  194.                                      result= {  
  195.                                                key: _clearAllKey,  
  196.                                                value: result  
  197.                                      };  
  198.                                      //保存键  
  199.                                      __setItem(_clearAllKey,result);        
  200.                             }  
  201.                              
  202.                    }catch (e) {  
  203.                    }  
  204.          }  
  205.      
  206.    //移除具有的本地数据  
  207.    function _clearAll(){  
  208.        result = _getItem({key : _clearAllKey});  
  209.        if(result) {  
  210.            var allKeys = result.split(“|”);  
  211.            var count = allKeys.length;  
  212.            for(var i = 0;i < count;i++){  
  213.                 if(!!allKeys[i]) {  
  214.                    _removeItem({key:allKeys[i]});  
  215.                 }  
  216.            }  
  217.        }  
  218.     }  
  219.      
  220.      
  221.    /**  
  222.     * 获取具备的本地存款和储蓄数据对应的key  
  223.     * @return {Array} 所有的key  
  224.     * @private  
  225.     */  
  226.    function _getAllKeys(){  
  227.        var result = [];  
  228.        var keys = _getItem({key : _clearAllKey});  
  229.        if(keys) {  
  230.            keys = keys.split(‘|’);  
  231.            for(var i = 0,len = keys.length;i < len;i++){  
  232.                 if(!!keys[i]) {  
  233.                     result.push(keys[i]);  
  234.                 }  
  235.            }  
  236.        }  
  237.        return result ;  
  238.     }  
  239.      
  240.    /**  
  241.     * 推断当前浏览器是还是不是协助地方存款和储蓄:window.localStorage  
  242.     * @return {Boolean} true:支持;false:不支持  
  243.     * @remark 支持地点存款和储蓄的浏览器:IE八+、Firefox叁.0+、Opera10.5+、Chrome四.0+、Safari四.0+、HUAWEI2.0+、Andrioid2.0+  
  244.     * @private  
  245.     */  
  246.    var _isSupportLocalStorage = ((‘localStorage’ in window) &&(window[‘localStorage’] !== null)),  
  247.        _isSupportUserData = !!jQuery.browser.ie;  
  248.      
  249.    qext.LocalStorage = {  
  250.        /**  
  251.         * 要是帮忙本地存款和储蓄,重返true;不然再次回到false  
  252.         * @type Boolean  
  253.         */  
  254.        isAvailable : _isSupportLocalStorage || _isSupportUserData,  
  255.          
  256.        /**  
  257.         * 将数据开始展览本地存款和储蓄(只可以存款和储蓄字符串音信)  
  258.         * <pre><code>  
  259.                     * //保存单个对象  
  260.                     * qext.LocalStorage.set({  
  261.                     *             key: “username”,  
  262.                     *             value: “baiduie”,  
  263.                     *             expires: 3600 * 1000  
  264.                     * });  
  265.                     * //保存对个对象  
  266.                     * qext.LocalStorage.set([{  
  267.                     *             key: “username”,  
  268.                     *             value: “baiduie”,  
  269.                     *             expires: 3600 * 1000  
  270.                     * },{  
  271.                     *             key: “password”,  
  272.                     *             value: “zxlie”,  
  273.                     *             expires: 3600 * 1000  
  274.                     * }]);  
  275.         * </code></pre>  
  276.         * @param {Object} obj 待存储数占领关布署,可以是单个JSON对象,也能够是由多个JSON对象组成的数组  
  277.         * <ul>  
  278.         * <li><b>key</b> : String <divclassdivclass=”sub-desc”>待存款和储蓄数据的key,务必将key值起的复杂一些,如:baidu.username</div></li>  
  279.         * <li><b>value</b> : String <divclassdivclass=”sub-desc”>待存款和储蓄数据的剧情</div></li>  
  280.         * <li><b>expires</b> : String/Object (Optional)<divclassdivclass=”sub-desc”>数据的逾期时间,能够是数字,单位是皮秒;也足以是日期对象,表示过期时间</div></li>  
  281.         * </ul>  
  282.         */  
  283.        set : function(obj){  
  284.                             //保存单个对象  
  285.                             var_set_ = function(config){  
  286.                                      //key校验  
  287.                                      if(!_isValidKey(config.key)){return;}  
  288.    
  289.                                      //待存款和储蓄的数据  
  290.                                      varstorageInfo = config || {};  
  291.                                       
  292.                                      //协助地方存款和储蓄的浏览器:IE八+、Firefox3.0+、Opera10.5+、Chrome4.0+、Safari四.0+、一加二.0+、Andrioid2.0+  
  293.                                      if(_isSupportLocalStorage){  
  294.                                                window.localStorage.setItem(storageInfo.key,storageInfo.value);  
  295.                                                if(config.expires){  
  296.                         var expires;  
  297.                         //若是设置项里的expires为数字,则意味数据的能存活的纳秒数  
  298.                         if (‘number’ == typeofstorageInfo.expires) {  
  299.                             expires = newDate();  
  300. 澳门葡京,                           expires.setTime(expires.getTime() + storageInfo.expires);  
  301.                         }  
  302.    
  303.                        window.localStorage.setItem(storageInfo.key +”.expires”,expires);  
  304.                                                }  
  305.                                      }else if(_isSupportUserData) { //IE7及以下版本,选取UserData格局  
  306.                                                _setItem(config.key,storageInfo);  
  307.                                      }         
  308.                             };  
  309.    
  310.                             //判定传入的参数是或不是为数组  
  311.                             if(obj&& obj.constructor === Array && obj instanceof Array){  
  312.                                      for(vari = 0,len = obj.length;i < len;i++){  
  313.                                                _set_(obj[i]);  
  314.                                      }  
  315.                             }elseif(obj){  
  316.                                      _set_(obj);  
  317.                             }  
  318.        },  
  319.                     
  320.                    /**  
  321.                     * 提取本地存款和储蓄的多少  
  322.         * <pre><code>  
  323.                     * //获取某二个本地存款和储蓄,再次来到值为:{key:””,value:””,expires:””},未取到值时重回值为:null  
  324.                     * var rst = qext.LocalStorage.get({  
  325.                     *             key: “username”  
  326.                     * });  
  327.                     * //获取几个地面存款和储蓄,再次来到值为:[“”,””,””],未取到值时重返值为:[null,null,null]  
  328.                     * qext.LocalStorage.get([{  
  329.                     *             key: “username”  
  330.                     * },{  
  331.                     *             key: “password”  
  332.                     * },{  
  333.                     *             key: “sex”  
  334.                     * }]);  
  335.         * </code></pre>  
  336.                     * @param {String} obj 待获取的囤积数据相关计划,支持单个对象传入,同样也支撑几个目的封装的数组格式  
  337.                     * @config {String} key 待存款和储蓄数据的key  
  338.                     * @return {String} 本地存款和储蓄的数额,传入为单个对象时,重返单个对象,获取不到时回来null;传入为数组时,再次回到为数组  
  339.                     */  
  340.        get : function(obj){  
  341.                             //获取某多个本地存款和储蓄  
  342.                             var_get_ = function(config){  
  343.                                      //结果       
  344.                                      varresult = null;  
  345.                                      if(typeofconfig === “string”) config = {key : config};  
  346.                                      //key校验  
  347.                                      if(!_isValidKey(config.key)){return result;}  
  348.                                       
  349.                                      //帮助地点存款和储蓄的浏览器:IE八+、Firefox3.0+、Opera10.伍+、Chrome4.0+、Safari4.0+、小米贰.0+、Andrioid二.0+  
  350.                                      if(_isSupportLocalStorage){  
  351.                                                result= window.localStorage.getItem(config.key);  
  352.                                                //过期时间剖断,假如过期了,则移除该项  
  353.                                                if(result){  
  354.                                                         varexpires = window.localStorage.getItem(config.key + “.expires”);  
  355.                                                         result= {  
  356.                                                                  value: result,  
  357.                                                                  expires: expires ? new Date(expires) : null  
  358.                                                         };  
  359.                                                         if(result&& result.expires && result.expires < new Date()) {  
  360.                                                                  result= null;  
  361.                                                                  window.localStorage.removeItem(config.key);  
  362.                            window.localStorage.removeItem(config.key + “.expires”);  
  363.                                                         }  
  364.                                                }  
  365.                                      }else if(_isSupportUserData) { //IE七及以下版本,选取UserData情势  
  366.                                                //那里不用单独剖断其expires,因为UserData本人装有那个判定  
  367.                                                result= _getItem(config);  
  368.                                                if(result){  
  369.                                                         result= { value : result };  
  370.                                                }  
  371.                                      }  
  372.                                       
  373.                                      returnresult ? result.value : null;  
  374.                             };  
  375.                              
  376.                             varrst = null;  
  377.                             //推断传入的参数是或不是为数组  
  378.                             if(obj&& obj.constructor === Array && obj instanceof Array){  
  379.                                      rst= [];  
  380.                                      for(vari = 0,len = obj.length;i < len;i++){  
  381.                                                rst.push(_get_(obj[i]));  
  382.                                      }  
  383.                             }elseif(obj){  
  384.                                      rst= _get_(obj);  
  385.                             }  
  386.                             returnrst;  
  387.        },  
  388.          
  389.        /**  
  390.         * 移除某1项地方存款和储蓄的数据  
  391.         * <pre><code>  
  392.                     * //删除二个当地存款和储蓄项  
  393.                     * qext.LocalStorage.remove({  
  394.                     *             key: “username”  
  395.                     * });  
  396.                     * //删除多个地点存储项目 *  
  397.                     * qext.LocalStorage.remove([{  
  398.                     *             key: “username”  
  399.                     * },{  
  400.                     *             key: “password”  
  401.                     * },{  
  402.                     *             key: “sex”  
  403.                     * }]);  
  404.         * </code></pre>  
  405.                     * @param {String} obj 待移除的积累数据相关配置,协助移除某1个地面存款和储蓄,也支撑数组格局的批量移除  
  406.                     * @config {String} key 待移除数据的key  
  407.                     * @return 无  
  408.         */  
  409.        remove : function(obj){  
  410.                             //移除某一项地点存款和储蓄的数量  
  411.                             var_remove_ = function(config){  
  412.                                      //帮助本地存款和储蓄的浏览器:IE八+、Firefox三.0+、Opera拾.5+、Chrome4.0+、Safari四.0+、One plus2.0+、Andrioid二.0+  
  413.                                      if(_isSupportLocalStorage){  
  414.                                                window.localStorage.removeItem(config.key);  
  415.                                                window.localStorage.removeItem(config.key+ “.expires”);  
  416.                                      }else if(_isSupportUserData){ //IE七及以下版本,选用UserData格局  
  417.                                                _removeItem(config);  
  418.                                      }  
  419.                             };  
  420.                              
  421.                             //推断传入的参数是或不是为数组  
  422.                             if(obj&& obj.constructor === Array && obj instanceof Array){  
  423.                                      for(vari = 0,len = obj.length;i < len;i++){  
  424.                                                _remove_(obj[i]);  
  425.                                      }  
  426.                             }elseif(obj){  
  427.                                      _remove_(obj);  
  428.                             }  
  429.        },  
  430.          
  431.        /**  
  432.         * 清除全部地点存款和储蓄的数目  
  433.         * <pre><code>  
  434.         * qext.LocalStorage.clearAll();  
  435.         * </code></pre>  
  436.         */  
  437.        clearAll : function(){  
  438.            //支持本地存款和储蓄的浏览器:IE八+、Firefox三.0+、Opera10.伍+、Chrome四.0+、Safari四.0+、One plus二.0+、Andrioid2.0+  
  439.            if(_isSupportLocalStorage) {  
  440.                 window.localStorage.clear();  
  441.            } else if(_isSupportUserData) { //IE7及以下版本,采取UserData形式  
  442.                 _clearAll();  
  443.            }  
  444.        },  
  445.          
  446.        //保存单个对象到本地  
  447.        save:function(StudentID,ExamID,QuestionID,ExamAnswer){  
  448.        qext.LocalStorage.set({  
  449.           key : StudentID+ExamID+QuestionID,  
  450.           value : “{  StudentID’: ‘”+StudentID+”’,‘ExamID’: ‘”+ExamID+”’, ‘QuestionID’:‘”+QuestionID+”’,‘ExamAnswer’: ‘”+ExamAnswer+”’}”,  
  451.           expires : 3600 * 1000  /*单位:ms*/  
  452.        });  
  453.        },  
  454.        /**  
  455.         * 获取具备的地点存储数据对应的key  
  456.         * <pre><code>  
  457.         * var keys = qext.LocalStorage.getAllKeys();  
  458.         * </code></pre>  
  459.         * @return {Array} 所有的key  
  460.         */  
  461.        getAllKeys : function(){  
  462.            var result = [];  
  463.            //扶助本地存款和储蓄的浏览器:IE八+、Firefox三.0+、Opera十.5+、Chrome四.0+、Safari肆.0+、诺基亚2.0+、Andrioid二.0+  
  464.            if(_isSupportLocalStorage) {  
  465.                 var key;  
  466.                 for(var i = 0,len =window.localStorage.length;i < len;i++){  
  467.                     key = window.localStorage.key(i);  
  468.                    if(!/.+\.expires$/.test(key)) {  
  469.                         result.push(key);  
  470.                     }  
  471.                 }  
  472.            } else if(_isSupportUserData) { //IE七及以下版本,选取UserData方式  
  473.                 result = _getAllKeys();  
  474.            }  
  475.              
  476.            return result;  
  477.        }  
  478.    };  
  479.    
  480. })();  

 

挺钦佩封装那几个代码的人,感到无论从编程习贯照旧代码的材质上都值得每1个人读书,所以,推荐一下。

到此,全体的地点存款和储蓄的主题材料都解决了,又是宏观的1天!

上面是二个完好无缺的次序:作者是完全的次第

在做试验系统时要求减轻那样一个难题,正是当考生考试时大概出现身断网、关闭浏览器,刷新等难点,数据此…

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website