认清safir浏览器存款和储蓄数据,包容多浏览器的地点存款和储蓄

By admin in 4858美高梅 on 2019年4月26日

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’) > -一, //苹果、谷歌(谷歌(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;
}
}

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,而机房的网有时候实在是令人捉急,所以,思量换1种方案。

直接读取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能够缓慢解决这几个主题素材。

直白读取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.          //读取文件一行内容到字符串  
  16.          s= ts.ReadLine();  
  17.          //呈现字符串新闻  
  18.          alert(“文件音信是: “+s);  
  19.          //关闭文件  
  20.          ts.Close();  
  21.           
  22. </script>  

 

   
但是这样写即使轻松,带来的弊端也不少,于是上网查到UserData能够缓和这一个难点。

UserData完成格局:

   
userData行为因此将数据写入二个UserData存款和储蓄区(UserDatastore)来保存数据,userData能够将数据以XML格式保存在客户端Computer上,假诺你用的是
Windows 3000 也许 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下使用,所以也兑现了须臾间:

 

[html] view
plaincopy4858美高梅 14858美高梅 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格式保存在客户端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浏览器关闭也许刷新了,下一次进入该页面,数据也能够重新载入而不会丢掉。

   
可是,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>  

 

HTML5 LocalStorage   

   
不过,毕竟UserData有他的局限性,处于包容思考,也在达成进程中听大人说了一种叫HTML5 LocalStorage 的东西。

要介绍HTML5 LocalStorage,首先介绍一下地点存款和储蓄的野史:

4858美高梅 3

 

   
从那边能够看出来,当地存款和储蓄一路从Cookies走到最后,真心的不易于,那么,HTML5 LocalStorage 具体有何样利润呢?

   
最早的Cookies自然是豪门都清楚,难题根本便是太小,大约也就4KB的标准,而且IE5只支持每种域名十多个cookies,太少了。优势便是我们都协助,而且协理得还蛮好。很早在此之前那个禁止使用cookies的用户也都慢慢的不设有了,就就好像在此以前禁止使用javascript的用户不存在了同壹。

   
userData是IE的事物。未来用的最多的是Flash,空间是Cookie的二伍倍,基本够用。再之后谷歌推出了Gears,即使并未有界定,但不适的地方正是要装额外的插件。到了HTML5把那么些都统一了,官方建议是各种网址五MB,一点都相当的大了,就存些字符串,丰富了。比较离奇的是竟然全部援助的浏览器方今都使用的五MB,固然有一些浏览器能够让用户设置,但对于网页制作者来说,如今的地形就伍MB来思虑是比较稳当的。

    那么,有怎么着浏览器帮忙她吗?

4858美高梅 4

 

   
所以依照图大家能够见到,能力从而的浏览器都援救HTML伍 LocalStorage,所以,这也让本土存储前途一片光明啊!

    上面写2个粗略的实例:

  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.                     //修改1个键值,测试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都有了,大家详细的讲一下它的1部分特性:

4858美高梅 5

 

   
到那里,基本上基本的概念和轻易的demo就都清楚了,以往亟需的正是把那个事物组成到贰头,因为我们领略HTML5 LocalStorage无法支持IE捌以下的浏览器,可是考试系统运维的条件超过一半都在IE捌以下,所以我们假如想做二个包容性相比较好的地点存款和储蓄,就需求UserData和HTML5 LocalStorage连起来用,只要武功深铁杵磨成针,在落成的经过中,作者在英特网找到了这么好的代码,终究以贯彻程序为主,又好使的,依旧用用好使的啊。下边是代码:

自己是以史为鉴的代码哦

   
可是那一个稿子里未有对命名空间给出代码,所以间接行使是有非凡态的,须求参预命名空间的代码,以下是自己稍微退换了须臾间,并且适应于考试系统的代码:

HTML5 LocalStorage   

   
不过,终究UserData有他的局限性,处于包容考虑,也在达成进度中据书上说了一种叫HTML伍 LocalStorage 的东西。

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

4858美高梅 6

 

   
从那边能够看出来,本地存款和储蓄一路从Cookies走到最终,真心的不轻巧,那么,HTML5 LocalStorage 具体有哪些便宜呢?

   
最早的Cookies自然是豪门都领悟,难点主要正是太小,差不多也就4KB的样板,而且IE7头辅助每一个域名20个cookies,太少了。优势就是大家都协理,而且协助得还蛮好。很早从前这些禁止使用cookies的用户也都日益的不设有了,就象是从前禁止使用javascript的用户不存在了平等。

   
userData是IE的事物。未来用的最多的是Flash,空间是Cookie的25倍,基本够用。再然后谷歌(Google)推出了Gears,即便未有范围,但不适的地点正是要装额外的插件。到了HTML五把那一个都合并了,官方建议是每一种网址五MB,相当的大了,就存些字符串,丰裕了。相比好奇的是竟然全数辅助的浏览器目前都应用的五MB,就算有部分浏览器能够让用户安装,但对于网页制笔者来讲,目前的时势就5MB来思索是相比安妥的。

    那么,有啥浏览器协理他啊?

4858美高梅 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]认清safir浏览器存款和储蓄数据,包容多浏览器的地点存款和储蓄。)!=”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.                     //修改1个键值,测试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都有了,我们详细的讲一下它的片段性质:

4858美高梅 8

 

   
到此处,基本上基本的定义和省略的demo就都了然了,今后亟待的正是把那个东西组成到2头,因为大家清楚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.          //获取某3个地面存款和储蓄,重回值为:{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是1致的  
  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+、Safari四.0+、OPPO贰.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拾.五+、Chrome四.0+、Safari四.0+、中兴二.0+、Andrioid二.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.                     * //获取某3个本地存款和储蓄,重回值为:{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+、Opera10.5+、Chrome4.0+、Safari四.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.                     * //删除1个地点存款和储蓄项  
  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 待移除的存款和储蓄数据相关配置,帮助移除某三个地面存款和储蓄,也支撑数组格局的批量移除  
  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八+、Firefox三.0+、Opera拾.伍+、Chrome4.0+、Safari四.0+、三星二.0+、Andrioid贰.0+  
  439.            if(_isSupportLocalStorage) {  
  440.                 window.localStorage.clear();  
  441.            } else if(_isSupportUserData) { //IE七及以下版本,选用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.            //协理地方存款和储蓄的浏览器:IE8+、Firefox3.0+、Opera拾.5+、Chrome四.0+、Safari4.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) { //IE7及以下版本,接纳UserData格局  
  473.                 result = _getAllKeys();  
  474.            }  
  475.              
  476.            return result;  
  477.        }  
  478.    };  
  479.    
  480. })();  

 

挺钦佩封装这些代码的人,感到无论从编制程序习贯依然代码的身分上都值得每1位学习,所以,推荐一下。

到此,全体的地面存储的标题都化解了,又是无微不至的一天!

上面是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.          //获取某2个地点存款和储蓄,重返值为:{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是千篇1律的  
  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. 4858美高梅,           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拾.5+、Chrome四.0+、Safari肆.0+、黑莓二.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+、Opera10.五+、Chrome四.0+、Safari四.0+、黑莓二.0+、Andrioid二.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.                     * //获取某1个本土存款和储蓄,再次来到值为:{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十.5+、Chrome4.0+、Safari四.0+、HTC二.0+、Andrioid2.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.         * 移除某一项地方存款和储蓄的数量  
  391.         * <pre><code>  
  392.                     * //删除2个本土存款和储蓄项  
  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 待移除的储存数据有关安插,补助移除某二个本地存款和储蓄,也支撑数组情势的批量移除  
  406.                     * @config {String} key 待移除数据的key  
  407.                     * @return 无  
  408.         */  
  409.        remove : function(obj){  
  410.                             //移除某1项地点存款和储蓄的数目  
  411.                             var_remove_ = function(config){  
  412.                                      //援助地点存储的浏览器:IE八+、Firefox三.0+、Opera10.5+、Chrome4.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八+、Firefox三.0+、Opera十.伍+、Chrome四.0+、Safari肆.0+、酷派2.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八+、Firefox3.0+、Opera十.伍+、Chrome4.0+、Safari四.0+、One plus2.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天!

上边是一个一体化的顺序:小编是全体的先后

在做试验系统时索要缓慢解决那样多少个难题,正是当考生考试时只怕出出现断网、关闭浏览器,刷新等难题,数据此…

发表评论

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

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有