2010-12-17 17 views
15

Czy można utworzyć plik cookie za pomocą tablic?Utwórz tablicę w pliku cookie za pomocą javascript

Chciałbym przechowywać a[0]='peter', a['1']='esther', a['2']='john' w ciasteczku w JavaScript.

+1

Biorąc pod uwagę charakter tablic, gotować (ograniczony rozmiar) jest ostatnim miejscem, w którym chciałbym zapisać jedną/ostatnią metodę przechowywania, której próbowałem użyć. – symcbean

Odpowiedz

7

Pliki cookie mogą zawierać tylko ciągi. Jeśli chcesz zasymulować tablicę, musisz ją przekształcić do postaci szeregowej i deserializować.

Można to zrobić z biblioteką JSON.

+0

Po prostu potrzebuję przechowywać tablicę ciągów. Czy jest to możliwe dzięki prostszej metodzie? – limfreak

+1

To jest prosta metoda. Są prostsze metody, ale są tylko nieco prostsze i znacznie mniej niezawodne. – Quentin

+0

Zdecydowanie używaj JSON. Możesz przechowywać "['foo', 'bar']" i sprawdzać później, ale może to być katastrofa pod względem wydajności i stabilności. –

1

Tworzenie tablicy w pliku cookie przy użyciu jquery?

var list = new cookieList("test"); $(img).one('click', function(i){ while($('.selected').length < 3) { 
    $(this).parent() 
     .addClass("selected") 
     .append(setup.config.overlay); 

    //$.cookie(setup.config.COOKIE_NAME, d, setup.config.OPTS); 
    var index = $(this).parent().index(); 

    // suppose this array go into cookies.. but failed 
    list.add(index); 

    var count = 'You have selected : <span>' + $('.selected').length + '</span> deals'; 
    if($('.total').length){ 
     $('.total').html(count); 
    } 

} }); 
1

zgadzam się z innych uwag - nie powinno się tego robić i należy używać JSON. Jednak, aby odpowiedzieć na twoje pytanie, możesz zhakować to, przechowując tablicę jako łańcuch rozdzielany przecinkami. Powiedzmy, że chcesz zapisać następującą tablicę JavaScript w pliku cookie:

var a = ['peter','esther','john']; 

można zdefiniować ciąg ciasteczek, następnie iteracyjne nad tablicy:

// Create a timestamp in the future for the cookie so it is valid 
var nowPreserve = new Date(); 
var oneYear = 365*24*60*60*1000; // one year in milliseconds 
var thenPreserve = nowPreserve.getTime() + oneYear; 
nowPreserve.setTime(thenPreserve); 
var expireTime = nowPreserve.toUTCString(); 

// Define the cookie id and default string 
var cookieId = 'arrayCookie'; 
var cookieStr = ''; 

// Loop over the array 
for(var i=0;i<a.length;i++) { 
    cookieStr += a[i]+','; 
} 

// Remove the last comma from the final string 
cookieStr = cookieStr.substr(0,cookieStr.length-1); 

// Now add the cookie 
document.cookie = cookieId+'='+cookieStr+';expires='+expireTime+';domain='+document.domain; 

W tym przykładzie, należy uzyskać następujący plik cookie przechowywane (jeżeli domena jest www.example.com):

arrayCookie=peter,ester,john;expires=1365094617464;domain=www.example.com 
+3

Wiem, że jest stary, ale mógłbyś właśnie zrobić var ​​a = ['peter', 'esther', 'john']. Join(); A następnie usuń pętlę i substr. – cazgp

+0

yes ... @ cazgp ....ale dobrze, aby usunąć ostatnie "," w powyższym –

39

Jak można przeczytać w tym topic:

Łączymy wtyczkę jQuery.cookie i JSON i rozwiązujemy problem.

Kiedy chcesz zapisać tablicę, należy utworzyć tablicę w JS i używać JSON.stringify aby przekształcić go w ciąg i przechowywane z $.cookie('name', 'array_string')

var myAry = [1, 2, 3]; 
$.cookie('name', JSON.stringify(myAry)); 

Gdy chcesz sprowadzaniu tablicę wewnątrz cookie, ty użyj wartości $.cookie('name'), aby pobrać wartość cookie i użyj JSON.parse, aby pobrać tablicę z ciągu znaków.

var storedAry = JSON.parse($.cookie('name')); 
//storedAry -> [1, 2, 3] 
1

dodać poniższy kod Script (patrz poniższy kod) do pliku JavaScript o nazwie CookieMonster.js.

To owinięcie wokół bieżącego urywek z http://www.quirksmode.org/js/cookies.html

Współpracuje z tablic i łańcuchów, to automagicznie uciec macierzy/przecinki STRING , i średniki ; (które nie są obsługiwane w oryginalnych fragmentów).

Mam wymienione proste użycie i dodatkowe wykorzystanie, które w nim wbudowałem.

wykorzystania:

//set cookie with array, expires in 30 days 
var newarray = ['s1', 's2', 's3', 's4', 's5', 's6', 's7']; 
cookiemonster.set('series', newarray, 30); 

var seriesarray = cookiemonster.get('series'); //returns array with the above numbers 

//set cookie with string, expires in 30 days 
cookiemonster.set('sample', 'sample, string;.', 30); 

var messagestring = cookiemonster.get('sample'); //returns string with 'sample, string;.' 

Bonusy:

//It also conveniently contains splice and append (works for string or array (single string add only)). 

//append string 
cookiemonster.append('sample', ' add this', 30); //sample cookie now reads 'sample, string;. add this' 

//append array 
cookiemonster.append('series', 's8', 30); //returns array with values ['s1', 's2', 's3', 's4', 's5', 's6', 's7', 's8'] 

//splice 
cookiemonster.splice('series', 1, 2, 30); //returns array with values ['s1', 's4', 's5', 's6', 's7', 's8'] 

CookieMonster.js:

 var cookiemonster = new Object(); 

     cookiemonster.append = function (cookieName, item, expDays) { 
      item = cm_clean(item); 
      var cookievalue = cookiemonster.get(cookieName); 
      if (cookievalue instanceof Array) { 
       cookievalue[cookievalue.length] = item; 
       cm_createCookie(cookieName, cm_arrayAsString(cookievalue), expDays); 
      } else { 
       cm_createCookie(cookieName, cookievalue + item, expDays); 
      } 
     }; 

     cookiemonster.splice = function (cookieName, index, numberToRemove, expDays) { 
      var cookievalue = cookiemonster.get(cookieName); 
      if (cookievalue instanceof Array) { 
       cookievalue.splice(index, numberToRemove); 
       cm_createCookie(cookieName, cm_arrayAsString(cookievalue), expDays); 
      } 
     }; 



     cookiemonster.get = function (cookieName) { 
      var cstring = cm_readCookie(cookieName); 
      if (cstring.indexOf('<#&type=ArrayVals>') != -1) { 

       var carray = cstring.split(','); 

       for (var i = 0; i < carray.length; i++) { 
         carray[i] = cm_dirty(carray[i]); 
       } 

       if (carray[0] == '<#&type=ArrayVals>') { 
        carray.splice(0, 1); 
       } 

       return carray; 

      } else { 

       return cm_dirty(cstring); 
      } 
     }; 

     cookiemonster.set = function (cookieName, value, expDays) { 
      if (value instanceof Array) { 
       cm_createCookie(cookieName, cm_arrayAsString(value), expDays); 
      } 
      else { cm_createCookie(cookieName, cm_clean(value), expDays); } 

     }; 

     cookiemonster.eraseCookie = function (name) { 
      cm_createCookie(name, "", -1); 
     }; 

     function cm_replaceAll(str, find, replace) { 

      return str.replace(new RegExp(find, 'g'), replace); 
     }; 

     function cm_clean(ret) { 
      ret = cm_replaceAll(ret.toString(), ',', '&#44'); 
      ret = cm_replaceAll(ret.toString(), ';', '&#59'); 
      return ret; 
     }; 
     function cm_dirty(ret) { 
      ret = cm_replaceAll(ret, '&#44', ','); 
      ret = cm_replaceAll(ret, '&#59', ';'); 
      return ret; 
     }; 

     function cm_createCookie(name, value, days) { 
      if (days) { 
       var date = new Date(); 
       date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); 
       var expires = "; expires=" + date.toGMTString(); 
      } else var expires = ""; 
      document.cookie = name + "=" + value + expires + "; path=/"; 
     }; 

     function cm_readCookie(name) { 
      var nameEQ = name + "="; 
      var ca = document.cookie.split(';'); 
      for (var i = 0; i < ca.length; i++) { 
       var c = ca[i]; 
       while (c.charAt(0) == ' ') c = c.substring(1, c.length); 
       if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); 
      } 
      return null; 
     }; 

     function cm_arrayAsString(array) { 
      var ret = "<#&type=ArrayVals>"; //escapes, tells that string is array 
      for (var i = 0; i < array.length; i++) { 
        ret = ret + "," + cm_clean(array[i]); 
      } 
      return ret; 
     }; 
0

Na tym przykładzie można to zrobić dość łatwo:

  • ciasteczek:

    ///W3Schools Cookie Code: 
    function setCookie(cname,cvalue,exdays) { 
        var d = new Date(); 
        d.setTime(d.getTime() + (exdays*24*60*60*1000)); 
        var expires = "expires=" + d.toGMTString(); 
        document.cookie = cname + "=" + cvalue + ";" + expires + ";"; 
    } 
    
    function getCookie(cname) { 
        var name = cname + "="; 
        var ca = document.cookie.split(';'); 
        for(var i = 0; i < ca.length; i++) { 
         var c = ca[i]; 
         while (c.charAt(0) == ' ') { 
          c = c.substring(1); 
         } 
         if (c.indexOf(name) == 0) { 
          return c.substring(name.length, c.length); 
         } 
        } 
        return ""; 
    } 
    
    ///My Own Code: 
    for(a=0;a<b.length;a++){ 
        setCookie(b[a],b[a],periodoftime); 
    } 
    
  • Odzyskaj Array:

    for(a=0;a<b.length;a++){ 
        b[a] = getCookie(b[a]) 
    } 
    

Dla każdej tablicy z innych typów wartości oprócz strun:

  • ciasteczek:

    ///Replace MyCode above With: 
    if(typeof b[a] === 'string'){ 
        setCookie(b[a],b[a],periodoftime); 
    }else{ 
        setCookie(b[a].toString,b[a],periodoftime); 
    } 
    
  • Odzyskaj tablicy:

    for(a=0;a<b.length;a++){ 
        if(typeof b[a] === 'string'){ 
         b[a] = getCookie(b[a]) 
        }else{ 
         b[a] = getCookie(b[a].toString) 
        } 
    } 
    

Jedyną wadą jest to, że identyczne wartości nie mogą być odzyskane.

Brak potrzebnego JQuery, oddzielania przecinków lub JSON.

0

Utworzyłem ten prosty sposób na pobieranie plików cookie. To da błąd jeśli wykonać tutaj, ale jest funkcjonalny

var arrayOfCookies = []; 
 
function parseCookieToArray() 
 
{ 
 
    var cookies  = document.cookie; 
 
    var arrayCookies = cookies.split(';'); 
 
    arrayCookies.map(function(originalValue){ 
 
     var name = originalValue.split('=')[0]; 
 
     var value = originalValue.split('=')[1]; 
 
     arrayOfCookies[name] = value; 
 
    }); 
 
} 
 
console.log(arrayOfCookies); //in my case get out: [language: 'en_US', country: 'brazil'] 
 
parseCookieToArray();

New Moje nowe obj do createget ciasteczka

cookie = { 
    set: function(name, value) { 
     document.cookie = name+"="+value; 
    }, 
    get: function(name) { 
     cookies = document.cookie; 
     r = cookies.split(';').reduce(function(acc, item){ 
      let c = item.split('='); //'nome=Marcelindo' transform in Array[0] = 'nome', Array[1] = 'Marcelindo' 
      c[0] = c[0].replace(' ', ''); //remove white space from key cookie 
      acc[c[0]] = c[1]; //acc == accumulator, he accomulates all data, on ends, return to r variable 
      return acc; //here do not return to r variable, here return to accumulator 
     },[]); 
    } 
}; 
cookie.set('nome', 'Marcelindo'); 
cookie.get('nome'); 

I wybaczcie za moje Beginner Angielski .

Powiązane problemy