Obtenir cookie par nom

j'ai un getter pour obtenir la valeur d'un cookie.

maintenant j'ai 2 cookies par le nom shares= et par le nom obligations= .

je veux faire ce getter seulement pour obtenir les valeurs du cookie d'obligations.

Comment faire? Ainsi ,le ' for ' divise les données en valeurs séparées et les place dans un tableau.

 function getCookie1() {
// What do I have to add here to look only in the "obligations=" cookie? 
// Because now it searches all the cookies.

    var elements = document.cookie.split('=');
    var obligations= elements[1].split('%');
    for (var i = 0; i < obligations.length - 1; i++) {
        var tmp = obligations[i].split('$');
        addProduct1(tmp[0], tmp[1], tmp[2], tmp[3]);
    }
 }
260
demandé sur p.campbell 2012-05-24 06:29:16

30 réponses

une approche, qui évite d'itérer sur un tableau, serait:

function getCookie(name) {
  var value = "; " + document.cookie;
  var parts = value.split("; " + name + "=");
  if (parts.length == 2) return parts.pop().split(";").shift();
}

Soluce

séparer une chaîne par un token produira soit un tableau avec une chaîne (même valeur), au cas où token n'existe pas dans une chaîne, soit un tableau avec deux chaînes, au cas où token se trouve dans une chaîne .

le premier élément (à gauche) est chaîne de ce qui était avant le jeton, et le second (à droite) est ce qui est une chaîne de ce qui était après le jeton.

(NOTE: dans le cas où la chaîne de caractères commence par un jeton, le premier élément est une chaîne vide)

considérant que les cookies sont stockés comme suit:

"{name}={value}; {name}={value}; ..."

pour récupérer une valeur de cookie spécifique, nous avons juste besoin d'une chaîne de caractères qui est après"; {name}= "et avant le suivant";". Avant tout traitement, nous préparons la chaîne de cookies avec";", de sorte que chaque nom de cookie, y compris le premier, est inclus avec "; "et"=":

"; {name}={value}; {name}={value}; ..."

maintenant, nous pouvons d'abord diviser par "; {name}=", et si token se trouve dans une chaîne de cookie (i.e. nous avons deux éléments), nous finirons avec le deuxième élément étant une chaîne qui commence avec notre valeur de cookie. Puis nous retirons cela d'un tableau (i.e. pop), et répétons le même processus, mais maintenant avec ";" comme un jeton, mais cette fois en tirant la chaîne de gauche (i.e. shift) pour obtenir la valeur réelle du jeton.

373
répondu kirlich 2013-12-24 19:43:07

je préférerais utiliser une seule correspondance d'expression régulière sur le cookie:

window.getCookie = function(name) {
  var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
  if (match) return match[2];
}

amélioré grâce à Scott Jungwirth dans les commentaires.

102
répondu Jonathan Camenisch 2018-05-23 20:12:29

utiliser un cookie obtenir le script:

function 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;
}

alors appelez-le:

var value = readCookie('obligations');

j'ai volé le code ci-dessus de la page des cookies quirksmode. vous devriez le lire .

66
répondu mkoryak 2012-05-24 02:37:47

si vous utilisez jQuery, je vous recommande d'utiliser ce plugin:

https://github.com/carhartl/jquery-cookie

https://github.com/carhartl/jquery-cookie/blob/master/jquery.cookie.js

<script type="text/javascript"
 src="//cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js">

pour que vous puissiez lire cookie comme ceci:

var value = $.cookie("obligations");

vous pouvez aussi écrire cookie:

$.cookie('obligations', 'new_value');
$.cookie('obligations', 'new_value', { expires: 14, path: '/' });

Supprimer cookie:

$.removeCookie('obligations');
46
répondu trante 2014-05-12 17:57:18

les méthodes de certaines autres réponses qui utilisent une expression régulière ne couvrent pas tous les cas, en particulier:

  1. quand le cookie est le dernier. Dans ce cas, il n'y aura pas de point-virgule après la valeur du cookie.
  2. Lorsqu'un autre nom de cookie se termine par le nom recherché. Par exemple, vous recherchez le cookie nommé "one", et il y a un cookie nommé "done".
  3. quand le cookie nom comprend les caractères qui ne sont pas interprétés comme eux-mêmes lorsqu'ils sont utilisés dans une expression régulière à moins qu'ils ne soient précédés d'un antislash.

la méthode suivante traite ces cas:

function getCookie(name) {
    function escape(s) { return s.replace(/([.*+?\^${}()|\[\]\/\])/g, '\'); };
    var match = document.cookie.match(RegExp('(?:^|;\s*)' + escape(name) + '=([^;]*)'));
    return match ? match[1] : null;
}

cette option renvoie null si le témoin n'est pas trouvé. Elle renvoie une chaîne vide si la valeur du cookie est vide.

Notes:

  1. cette fonction suppose les noms de témoins sont sensibles à la casse .
  2. document.cookie - lorsque cela apparaît sur le côté droit d'une tâche, cela représente une chaîne contenant une liste de cookies séparés par un point-virgule, Qui sont à leur tour des paires name=value . Il semble y avoir un seul espace après chaque virgule.
  3. String.prototype.match() - renvoie null quand aucune correspondance n'est trouvée. Retourne un tableau lorsqu'une correspondance est trouvée, et l'élément à l'index [1] est la valeur du premier groupe correspondant.

Expression Régulière Notes:

  1. (?:xxxx) - forme un groupe non apparié.
  2. ^ - correspond au début de la chaîne.
  3. | - sépare les modèles alternatifs pour le groupe.
  4. ;\s* - correspond à un point-virgule suivi par zéro ou plusieurs caractères espace.
  5. = - correspond à un signe égal.
  6. (xxxx) - forme un groupe de correspondance.
  7. [^;]* - correspond à zéro ou plusieurs caractères autres qu'un point-virgule. Cela signifie qu'il va faire correspondre les caractères jusqu'à, mais sans inclure, un point-virgule ou à la fin de la chaîne.
34
répondu John S 2017-05-23 11:33:26

j'ai modifié la fonction que Jonathan a fournie ici, en utilisant l'expression régulière vous pouvez obtenir une valeur de cookie par son nom comme ceci:

function getCookie(name){
    var pattern = RegExp(name + "=.[^;]*")
    matched = document.cookie.match(pattern)
    if(matched){
        var cookie = matched[0].split('=')
        return cookie[1]
    }
    return false
}

s'il renvoie une chaîne vide, cela signifie que le cookie existe mais n'a aucune valeur, s'il renvoie false, alors le cookie n'existe pas. J'espère que cette aide.

15
répondu Mohyaddin Alaoddin 2014-01-15 15:36:02

je sais que c'est une vieille question, mais je suis tombé sur ce problème aussi. Juste pour mémoire, il y a une petite API dans les développeurs mozilla web page .

Yoy peut obtenir n'importe quel cookie par nom en utilisant seulement JS. Le code est aussi plus propre IMHO (sauf pour la longue ligne, que je suis sûr que vous pouvez facilement réparer).

function getCookie(sKey) {
    if (!sKey) { return null; }
    return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\$&") + "\s*\=\s*([^;]*).*$)|^.*$"), "")) || null;
}

comme indiqué dans les commentaires soyez conscient que cette méthode suppose que la clé et la valeur ont été encodées en utilisant encodeURIComponent (). Supprimer decode & encodeURIComponent() si la clé et la valeur du cookie n'ont pas été encodées.

9
répondu Marc 2015-04-08 08:55:58

4 ans plus tard, version ES6 plus simple.

function getCookie(name) {
  let cookie = {};
  document.cookie.split(';').forEach(function(el) {
    let [k,v] = el.split('=');
    cookie[k.trim()] = v;
  })
  return cookie[name];
}

j'ai également créé un gist pour l'utiliser comme un Cookie objet. par exemple, Cookie.set(name,value) et Cookie.get(name)

cela lire tous les cookies au lieu de numériser. C'est ok pour un petit nombre de témoins.

9
répondu allenhwkim 2018-03-11 20:19:27

Utiliser object.defineProperty

avec cela, vous pouvez facilement accéder aux cookies

Object.defineProperty(window, "Cookies", {
    get: function() {
        return document.cookie.split(';').reduce(function(cookies, cookie) {
            cookies[cookie.split("=")[0]] = unescape(cookie.split("=")[1]);
            return cookies
        }, {});
    }
});

à partir de Maintenant vous pouvez juste faire:

alert( Cookies.obligations );

cela se mettra automatiquement à jour aussi, donc si vous changez un cookie, le Cookies changera aussi.

7
répondu Downgoat 2016-01-16 06:41:25

fonctionne toujours bien:

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

function setCookie(variable, value, expires_seconds) {
    var d = new Date();
    d = new Date(d.getTime() + 1000 * expires_seconds);
    document.cookie = variable + '=' + value + '; expires=' + d.toGMTString() + ';';
}

Aucune exigence pour jQuery ou quoi que ce soit. Pur bon vieux JavaScript.

6
répondu Lukas 2015-03-13 16:52:59

Simple fonction pour Obtenir le biscuit avec le nom du cookie:

function getCookie(cn) {
    var name = cn+"=";
    var allCookie = decodeURIComponent(document.cookie).split(';');
    var cval = [];
    for(var i=0; i < allCookie.length; i++) {
        if (allCookie[i].trim().indexOf(name) == 0) {
            cval = allCookie[i].trim().split("=");
        }   
    }
    return (cval.length > 0) ? cval[1] : "";
}
6
répondu Saddam H 2017-07-04 20:15:49

kirlich a donné une bonne solution. Cependant, il échoue quand il y a deux valeurs de cookie avec des noms similaires, voici une solution simple pour cette situation:

function getCookie(name) {
  var value = "; " + document.cookie;
  var parts = value.split("; " + name + "=");
  if (parts.length >= 2) return parts.pop().split(";").shift();
}
5
répondu taydakov 2016-11-08 01:12:18

il me semble que vous pourriez diviser les paires clé-valeur du cookie en un tableau et baser votre recherche sur cela:

var obligations = getCookieData("obligations");

, qui exécute les opérations suivantes:

function getCookieData( name ) {
    var pairs = document.cookie.split("; "),
        count = pairs.length, parts; 
    while ( count-- ) {
        parts = pairs[count].split("=");
        if ( parts[0] === name )
            return parts[1];
    }
    return false;
}

violon: http://jsfiddle.net/qFmPc /

ou peut-être même la suivante:

function getCookieData( name ) {
    var patrn = new RegExp( "^" + name + "=(.*?);" ),
        patr2 = new RegExp( " " + name + "=(.*?);" );
    if ( match = (document.cookie.match(patrn) || document.cookie.match(patr2)) )
        return match[1];
    return false;
}
4
répondu Sampson 2012-05-24 03:28:41

dans mes projets j'utilise la fonction suivante pour accéder aux cookies par nom

function getCookie(cookie) {
    return document.cookie.split(';').reduce(function(prev, c) {
        var arr = c.split('=');
        return (arr[0].trim() === cookie) ? arr[1] : prev;
    }, undefined);
}
4
répondu Eugene Burtsev 2013-11-14 07:02:42

Voici une version assez courte

 function getCookie(n) {
    let a = `; ${document.cookie}`.match(`;\s*${n}=([^;]+)`);
    return a ? a[1] : '';
}

notez que j'ai utilisé les chaînes de template D'ES6 pour composer l'expression regex.

4
répondu mayor 2016-11-24 12:44:37
function getCookie(name) {
    var pair = document.cookie.split('; ').find(x => x.startsWith(name+'='));
    if (pair)
       return pair.split('=')[1]
}
3
répondu alpav 2017-03-26 23:15:12

il y a déjà de belles réponses ici pour obtenir le cookie, cependant voici ma propre solution :

function getcookie(cookiename){
var cookiestring  = document.cookie;
var cookiearray = cookiestring.split(';');
for(var i =0 ; i < cookiearray.length ; ++i){ 
    if(cookiearray[i].trim().match('^'+cookiename+'=')){ 
        return cookiearray[i].replace(`${cookiename}=`,'').trim();
    }
} return null;
}

usage: '

     getcookie('session_id');
   // gets cookie with name session_id
3
répondu Mazino S Ukah 2017-04-11 19:31:01

vous pouvez utiliser js-cookie bibliothèque pour obtenir et définir les cookies JavaScript.

Inclure dans votre code HTML:

<script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>

pour créer un Cookie:

Cookies.set('name', 'value');

pour lire un témoin:

Cookies.get('name'); // => 'value'
3
répondu LanilT 2018-08-21 11:31:12

référence: https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie

document.cookie = "test1=Hello";
document.cookie = "test2=World";

var cookieValue = document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "");

  alert(cookieValue);
3
répondu vidur punj 2018-09-20 07:36:57

ma solution est la suivante:

function getCookieValue(cookieName) {
    var ca = document.cookie.split('; ');
    return _.find(ca, function (cookie) {
        return cookie.indexOf(cookieName) === 0;
    });
}

cette fonction utilise les soulignements _.trouver la fonction. Retourne non défini si le nom du cookie n'existe pas

2
répondu atlefren 2016-01-19 19:31:44

Je l'ai fait de cette façon. pour que je puisse accéder à un objet pour séparer les valeurs.Avec ce u peut passer le cookie au parent et ensuite vous pouvez accéder à vos valeurs par les touches comme

var cookies=getCookieVal(mycookie);
alert(cookies.mykey);
function getCookieVal(parent) {
            var cookievalue = $.cookie(parent).split('&');
            var obj = {};
            $.each(cookievalue, function (i, v) {
                var key = v.substr(0, v.indexOf("="));
                var val = v.substr(v.indexOf("=") + 1, v.length);

                obj[key] = val;

            });
            return obj;
        }  
2
répondu saydur rahman 2017-11-26 11:16:07

javascript

document.cookie = 'cookiename=tesing';

obtenir par jquery avec le jquery-plugin cookie

var value = $.cookie("cookiename");

alert(value);
2
répondu user7434123 2018-05-07 18:47:57

apparemment, MDN n'a jamais entendu parler de la classe de caractères \b , qui correspond au \w+ contigu qui est limité de chaque côté par \W+ :

getCookie = function(name) {
    var r = document.cookie.match("\b" + name + "=([^;]*)\b");
    return r ? r[1] : null;
};

var obligations = getCookie('obligations');
2
répondu cowbert 2018-05-11 02:33:08

Une approche fonctionnelle de trouver les cookies existants. Il renvoie un tableau, donc il supporte plusieurs occurrences du même nom. Il ne supporte pas la correspondance partielle des clés, mais il est trivial de remplacer le === dans le filtre par un regex.

function getCookie(needle) {
    return document.cookie.split(';').map(function(cookiestring) {
        cs = cookiestring.trim().split('=');

        if(cs.length === 2) {
            return {'name' : cs[0], 'value' : cs[1]};
        } else {
            return {'name' : '', 'value' : ''};
        }
    })
    .filter(function(cookieObject) { 
        return (cookieObject.name === needle);
    });
}
1
répondu 79man 2017-04-23 06:28:37

la fonction suivante retournera une paire key-value du cookie requis, où key est le nom du cookie et value sera la valeur du cookie.

/**
 * Returns cookie key-value pair
 */
var getCookieByName = function(name) {
    var result = ['-1','-1'];
    if(name) {
        var cookieList = document.cookie.split(';');
        result = $.grep(cookieList,function(cookie) { 
            cookie = cookie.split('=')[0];
            return cookie == name;
        });
    }
    return result;
};
0
répondu Suhail Gupta 2016-01-11 07:29:48

Cookies exemple: exemple JS:

document.cookies = {
   create : function(key, value, time){
     if (time) {
         var date = new Date();
         date.setTime(date.getTime()+(time*24*60*60*1000));
         var expires = "; expires="+date.toGMTString();
     }
     else var expires = "";
     document.cookie = key+"="+value+expires+"; path=/";
   },
   erase : function(key){
     this.create(key,"",-1);
   },
   read : function(key){
     var keyX = key + "=";
     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(keyX) == 0) return   c.substring(keyX.length,c.length);
     }
     return null;
   }
}

stocker des tableaux et des objets avec JSON ou xml

0
répondu Kelk 2016-01-14 11:47:45

je ferais quelque chose comme ça:

function getCookie(cookie){
  return cookie
    .trim()
    .split(';')
    .map(function(line){return line.split(',');})
    .reduce(function(props,line) {
      var name = line[0].slice(0,line[0].search('='));
      var value = line[0].slice(line[0].search('='));
      props[name] = value;
      return props;
    },{})
}

ceci retournera votre cookie comme un objet.

et vous pouvez l'appeler comme ça:

getCookie(document.cookie)['shares']
0
répondu Julian Tellez 2016-01-15 15:59:44

j'aime utiliser une fermeture pour obtenir des valeurs de cookie par nom. La fermeture ci-dessous vous permettra d'obtenir une valeur de cookie par nom, mais ne analysera la chaîne de cookie que si elle a été mise à jour.

vous pouvez récupérer la valeur d'un cookie avec ce qui suit:

var foo = cookies.get( "bar" );

Code:

var cookies = ( function() {
    var cookieString = null;
    var cookieArray = [];

    function getValOf( name ) {
        if ( newCookies() ) {
            parseCookieString()
        }
        return cookieArray[ name ];
    }

    // Check if new cookies have been added
    function newCookies() {
        return cookieString === document.cookie;
    }

    function parseCookieString() {
        cookieString = document.cookie;

        // Separate cookies
        var cookies = cookieString.split( ";" );

        // Empty previous cookies
        cookieArray = [];

        // Update cookieArray with new name-value pairs
        for ( var i in cookies ) {

            // Separate name and value
            var nameVal = cookies[ i ].split( "=" );
            var name = nameVal[ 0 ].trim();
            var value = nameVal[ 1 ].trim();

            // Add cookie name value pair to dictionary
            cookieArray[ name ] = value;
        }
    }

    return {

        /**
         * Returns value or undefined
         */
        get: function( name ) {
            return getValOf( name );
        }  
    };
})();
0
répondu Dayton Bobbitt 2016-04-14 16:22:58

juste pour ajouter une réponse "officielle" à cette réponse, je suis copier / coller la solution pour configurer et récupérer les cookies de MDN (voici le JSfiddle 151970920 ""

    document.cookie = "test1=Hello";
    document.cookie = "test2=World";

    var cookieValue = document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "");

    function alertCookieValue() {
      alert(cookieValue);
    }

dans votre cas particulier, vous utiliseriez la fonction suivante

    function getCookieValue() {
      return document.cookie.replace(/(?:(?:^|.*;\s*)obligations\s*\=\s*([^;]*).*$)|^.*$/, "");
    }

noter que j'ai remplacé "test2" de l'exemple par "obligations".

0
répondu Erenor Paz 2018-05-09 08:11:36

maintenant, vous pouvez obtenir des cookies pour revenir comme un tableau lorsque vous avez stocké des cookies dans un format de tableau. par exemple, votre cookie est array [35] = Khóa; array[36]=T; et CE code avec utf8 aussi. une chose ne fonctionne pas bien lorsque votre nom de cookie contenu [] et on stocker les cookies n'est pas dans le tableau.

function getCookie(cname) {

            var ca = decodeURIComponent(document.cookie).split(';');


            if (cname.indexOf('[]') > 0) {
                var returnVAlue = [];
                var nameArray = cname.replace("[]", "");

                for(var i = 0; i < ca.length; i++) {
                    var c = ca[i];
                   // console.log(c);
                    while (c.charAt(0) == ' ') {
                        c = c.substring(1);
                    }

                    if (c.indexOf(nameArray) >= 0) {
                        var valueString = c.substr(nameArray.length, c.length);

                        var valueStringSlit = valueString.split('=');
                        valueStringSlit[0] = valueStringSlit[0].substr(1,(valueStringSlit[0].length - 2));
                    //    console.log(valueStringSlit);

                        returnVAlue.push(valueStringSlit);
                    }
                }
            } else {
                var returnVAlue = '';
                var name = cname + "=";

                for(var i = 0; i < ca.length; i++) {
                    var c = ca[i];
                   // console.log(c);
                    while (c.charAt(0) == ' ') {
                        c = c.substring(1);
                    }
                    if (c.indexOf(name) == 0) {
                        returnVAlue = c.substr(name.length, c.length);
                    } 
                }
            }


            if (returnVAlue != ''){
                return returnVAlue;
            } 
            return "";
        }

       // console.log(decodeURIComponent(document.cookie));


        console.log(getCookie('array[]'));
0
répondu Võ Minh 2018-09-26 06:57:56