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]);
}
}
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.
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.
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 .
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');
les méthodes de certaines autres réponses qui utilisent une expression régulière ne couvrent pas tous les cas, en particulier:
- quand le cookie est le dernier. Dans ce cas, il n'y aura pas de point-virgule après la valeur du cookie.
- 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".
- 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:
- cette fonction suppose les noms de témoins sont sensibles à la casse .
-
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 pairesname=value
. Il semble y avoir un seul espace après chaque virgule. -
String.prototype.match()
- renvoienull
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:
-
(?:xxxx)
- forme un groupe non apparié. -
^
- correspond au début de la chaîne. -
|
- sépare les modèles alternatifs pour le groupe. -
;\s*
- correspond à un point-virgule suivi par zéro ou plusieurs caractères espace. -
=
- correspond à un signe égal. -
(xxxx)
- forme un groupe de correspondance. -
[^;]*
- 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.
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.
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.
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.
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.
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.
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] : "";
}
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();
}
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;
}
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);
}
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.
function getCookie(name) {
var pair = document.cookie.split('; ').find(x => x.startsWith(name+'='));
if (pair)
return pair.split('=')[1]
}
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
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'
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);
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
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;
}
javascript
document.cookie = 'cookiename=tesing';
obtenir par jquery avec le jquery-plugin cookie
var value = $.cookie("cookiename");
alert(value);
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');
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);
});
}
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;
};
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
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']
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 );
}
};
})();
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".
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[]'));