2013-05-27 100 views
3

下面是我試圖找出爲什麼它不能正確工作的例子。如何使用分隔符在單個cookie中設置多個值?

它不斷給我空值。

我想了解如何在單個cookie中設置多個值。

每個cookie都包含一個名稱=值對,所以如果您需要存儲幾個單獨的數據片段(如用戶姓名,年齡和會員編號),則需要三個不同的cookie。

而不是這樣做,我使用分隔符技術來分割它,以便我可以使用更少的cookie。

如果可以的話,請給我看看這個正確實施的例子。我已經看到了其他編程語言的一些材料,但我想知道它是如何專門在JavaScript中完成的。

<!DOCTYPE html> 
<html> 
<head> 
<title> Using a delimiter to save on cookies used</title> 


<script> 

function createCookie(name, value, days, path, domain, secure) { 
    if (days) { 

     var date=new Date(); 
     date.setTime(date.getTime()+ (days*24*60*60*1000)); 
     var expires=date.toGMTString(); 

    } 

    else var expires = ""; 

    cookieString= name + "=" + escape (value); 

    if (expires) 
    cookieString += "; expires=" + expires; 

    if (path) 
    cookieString += "; path=" + escape (path); 

    if (domain) 
    cookieString += "; domain=" + escape (domain); 

    if (secure) 
    cookieString += "; secure"; 

    document.cookie=cookieString; 
} 

function getCookie(name) { 

    var nameEquals = name + "="; 
    var crumbs=document.cookie.split('|'); 

    for (var i = 0; i<crumbs.length; i++) { 
     var crumb = crumbs [i]; 
     if (crumb.indexOf(nameEquals) == 0) { 

     return unescape (crumb.substring(nameEquals.length, crumb.length)); 
     } 
    } 
    return null; 
} 

function deleteCookie(name){ 
    createCookie(name, "", -1); 
} 
var userdata="Joe|31|Athlete"; 

createCookie("user", userdata); 

var myUser=getCookie("user"); 

var myUserArray=myUser.split('|'); 

var name=myUserArray[0]; 

var age=myUserArray[1]; 

var profession=myUserArray[2]; 

</script> 
</head> 

<body> 

</body> 

</html> 
+0

您是否測試過您正在爲當前域設置Cookie?這可能是一個跨域問題.. –

回答

1


不使用 '|'作爲分隔符,它在不同的瀏覽器中實現不同(在你的分隔符中使用諸如「 - 」,「+」,「。」等)。當我檢查firefox>網站信息時,它告訴我,有一個cookie,但內容是Joe%7C31%7CAthlete。在我的版本,我把分隔符在我們之前的一切定義一個變量(我把「---」,但如果你願意,你可以改變它):

<!DOCTYPE html> 
<html> 
<head> 
<title> Using a delimiter to save on cookies used</title> 


<script> 
var delimiter = "---"; 

function createCookie(name, value, days, path, domain, secure) { 
    if (days) { 

     var date=new Date(); 
     date.setTime(date.getTime()+ (days*24*60*60*1000)); 
     var expires=date.toGMTString(); 

    } 

    else var expires = ""; 

    cookieString= name + "=" + escape (value); 

    if (expires) 
    cookieString += "; expires=" + expires; 

    if (path) 
    cookieString += "; path=" + escape (path); 

    if (domain) 
    cookieString += "; domain=" + escape (domain); 

    if (secure) 
    cookieString += "; secure"; 

    document.cookie=cookieString; 
} 

function getCookie(name) { 

    var nameEquals = name + "="; 
    var whole_cookie=document.cookie.split(nameEquals)[1].split(";")[0]; // get only the value of the cookie we need 
                     // (split by the name=, take everything after the name= and then split it by ";" and take everything before the ";") 
    var crumbs=whole_cookie.split(delimiter); // split now our cookie in its information parts 
    /*for (var i = 0; i<crumbs.length; i++) { 
     var crumb = crumbs [i]; 
     if (crumb.indexOf(nameEquals) == 0) { 

     return unescape (crumb.substring(nameEquals.length, crumb.length)); 
     } 
    }*/ // sorry... i dont understand what this does ;) but it works without it 
    return crumbs; // return the information parts as an array 
} 

function deleteCookie(name){ 
    createCookie(name, "", -1); 
} 

// --------------------- 
// DEBUGGING PART STARTS 
// --------------------- 

var userdata="Joe"+delimiter+"31"+delimiter+"Athlete"; 

createCookie("user", userdata); 

var myUserArray=getCookie("user"); 

var name=myUserArray[0]; 

var age=myUserArray[1]; 

var profession=myUserArray[2]; 

alert(myUserArray[0]); 
alert(myUserArray[1]); 
alert(myUserArray[2]); 

// --------------------- 
// DEBUGGING PART ENDS 
// --------------------- 
</script> 
</head> 

<body> 

</body> 

</html> 

當我測試,它工作正常:它在age拯救「喬」在name,「31」和「運動員」在job
我加了一些警惕調試,使您可以測試它太
再見,我希望我能幫助:)

+0

謝謝,我會在稍後看看。看看它是否有助於我獲得我想要的結果。 – weichan8t1

0

對我來說,你的代碼在Chrome上完美運行。

但是,我不得不在網絡服務器上運行它 - 如果我只是打開一個html文件,它不會保存任何cookie。

如果您在計算機上安裝Python中,你可以從HTML文件的目錄,這個命令來運行一個簡約的蟒蛇服務器要滿足:

$ python -m SimpleHTTPServer 8000 

然後,只是去http://127.0.0.1:8000與您的瀏覽器和該網站應該工作。

當然,你也可以使用任何其他的http服務器,如Apache或任何你想要的。

+0

我以前在Chrome上測試過。它也沒有工作。由於Web瀏覽器的限制,此類腳本僅適用於實際的託管服務器。 – weichan8t1

+0

這很奇怪,對我來說它沒有任何修改。你的cookie設置正確嗎? (即在'document.cookie'中是否有一些字符串?) – zeroos

1

好了,至於斯文L.提到分隔符你有喬%7C31%7CAthlete因爲

  • %7C是焦炭豎條的URL編碼值 「|

至於其他提到的分離器,請參閱Allowed characters in cookies

至於我在Firefox中,' - '和'。'未經編碼存儲在單個字節中,但'+'已轉換爲其編碼值%2B。選擇不被編碼的分隔符是有意義的。這樣分隔符只需要1個字節。所以,考慮到它的大小限制爲4kB,可以將更多有用的東西放入cookie值中。

相關問題