很多時(shí)候我們做web開(kāi)發(fā)往cookie里面存數(shù)據(jù),只是為了在不同的網(wǎng)頁(yè)之間跳轉(zhuǎn)的時(shí)候可以共享數(shù)據(jù),但是cookie里面的每個(gè)數(shù)據(jù)不管是否需要都會(huì)在每個(gè)同域的http請(qǐng)求中被發(fā)送往服務(wù)器,包括每個(gè)頁(yè)面、圖片、css、腳本或者ajax的的請(qǐng)求,這就無(wú)形中占用了多余的帶寬。更糟糕的是,一個(gè)網(wǎng)頁(yè)的cookie本來(lái)也只有有限的4k空間,一旦不小心寫(xiě)入的cookie超過(guò)了限制,就會(huì)造成原來(lái)有用的cookie丟失,這樣造成的bug非常難以追查。
因此我們?cè)贗E下面經(jīng)常使用userdata來(lái)保存共享數(shù)據(jù)。但是在firefox下面卻一直缺乏對(duì)應(yīng)的特性。
今天在看firefox 2.0的
?的時(shí)候,驚奇的發(fā)現(xiàn)一個(gè)新特性叫做:
Support for client-side session and persistent storage趕緊試驗(yàn)了一下,firefox2.0果然支持這個(gè)特性了。雖然還只能在session生命周期內(nèi)使用(而不像ie的userdata可以指定有效時(shí)間),但是總算解決了cookie占用的問(wèn)題了。
以前曾經(jīng)寫(xiě)過(guò)一個(gè)只支持ie的
userdata管理器,現(xiàn)在可以升級(jí)了:
<!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.0?Transitional//EN">
<HTML>
<HEAD>
<TITLE>?UserData?manager?</TITLE>
<META?NAME="Generator"?CONTENT="EditPlus">
<META?NAME="Author"?CONTENT="emu">
<META?NAME="Keywords"?CONTENT="IE?USER?DATA?manager">
<META?NAME="Description"?CONTENT="UserData?manager">
</HEAD>
<BODY>
<SCRIPT?LANGUAGE="JavaScript">
<!--
var?isIE?=?!!document.all;
if(isIE)
document.documentElement.addBehavior("#default#userdata");
function??saveUserData(key,?value){
????var?ex;?
????if(isIE){
????????with(document.documentElement)try?{
????????????load(key);
????????????setAttribute("value",?value);
????????????save(key);
????????????return??getAttribute("value");
????????}catch?(ex){
????????????alert(ex.message)
????????}
????}else?if(window.sessionStorage){//for?firefox?2.0+
????????try{
????????????sessionStorage.setItem(key,value)
????????}catch?(ex){
????????????alert(ex);
????????}
????}else{
????????alert("當(dāng)前瀏覽器不支持userdata或者sessionStorage特性")
????}
}
function?loadUserData(key){
????var?ex;?
????if(isIE){
????????with(document.documentElement)try{
????????????load(key);
????????????return?getAttribute("value");
????????}catch?(ex){
????????????alert(ex.message);return?null;
????????}
????}else?if(window.sessionStorage){//for?firefox?2.0+
????????try{
????????????return?sessionStorage.getItem(key)
????????}catch?(ex){
????????????alert(ex)
????????}
????}else{
????????alert("當(dāng)前瀏覽器不支持userdata或者sessionStorage特性")
????}
}
function??deleteUserData(key){
????var?ex;?
????if(isIE){
????????with(document.documentElement)try{
????????????load(key);
????????????expires?=?new?Date(315532799000).toUTCString();
????????????save(key);
????????}
????????catch?(ex){
????????????alert(ex.message);
????????}
????}else?if(window.sessionStorage){//for?firefox?2.0+
????????try{
????????????sessionStorage.removeItem(key)
????????}catch?(ex){
????????????alert(ex)
????????}
????}else{
????????alert("當(dāng)前瀏覽器不支持userdata或者sessionStorage特性")
????}
}?
saveUserData("emu","hello?world?!")
alert(loadUserData("emu"))
deleteUserData("emu")
alert(loadUserData("emu"))
//-->
</SCRIPT>
</BODY>
</HTML>
這個(gè)特性不能在本地網(wǎng)頁(yè)上試驗(yàn),必須把頁(yè)面用某個(gè)服務(wù)器(apache或者iis都可以)發(fā)布后用firefox訪問(wèn)。