按名称获取Cookie

我有一个getter从cookie获取价值。

现在我有名字shares=和名义义shares= 2个cookies。

我想让这个getter只从义务cookie获取值。

我如何做到这一点? 所以'for'把数据分成不同的值,并把它放在一个数组中。

  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]); } } 

避免迭代数组的一种方法是:

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

演练

按令牌拆分string将生成一个具有一个string(相同值)的数组,以防万一令牌不存在于string中,或​​者带有两个string的数组(如果在string中find令牌)。

第一个(左)元素是令牌之前的string,第二个(右)是令牌之后的string。

(注意:如果string以令牌开头,则第一个元素是空string)

考虑到cookie存储如下:

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

为了检索特定的cookie值,我们只需要得到“; {name} =”之后和下一个“;”之前的string。 在我们做任何处理之前,我们用“;”前缀cookiestring,以便每个cookie名称(包括第一个)都包含“;”和“=”:

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

现在,我们可以先通过“; {name} =”来分割,如果在一个cookiestring中find了token(即我们有两个元素),我们将以第二个元素为结束string开始我们的cookie值。 然后我们从数组(即popup)中拉出来,并重复相同的过程,但现在用“;” 作为一个标记,但这次拉出左边的string(即移位)来获取实际的标记值。

使用cookie获取脚本:

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

然后调用它:

 var value = readCookie('obligations'); 

我从quirksmode cookies页面偷取了上面的代码。 你应该阅读它 。

我更喜欢在cookie上使用单个正则expression式匹配:

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

如果你使用jQuery,我build议你使用这个插件:

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"> 

所以你可以像这样读取cookie:

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

你也可以写cookie:

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

删除Cookie:

 $.removeCookie('obligations'); 

其他一些使用正则expression式的答案中的方法并不能涵盖所有的情况,特别是:

  1. 当cookie是最后的cookie时。 在这种情况下,cookie值后面不会有分号。
  2. 当另一个cookie名称以查找的名字结束时。 例如,您正在查找名为“one”的cookie,并且有一个名为“done”的cookie。
  3. 当cookie名称包含在正则expression式中使用时不会被解释为自身的字符,除非它们前面有反斜杠。

以下方法处理这些情况:

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

如果没有findcookie,这将返回null 。 如果cookie的值为空,它将返回一个空string。

笔记:

  1. 这个函数假定cookie的名字是区分大小写的 。
  2. document.cookie – 当它出现在赋值的右边时,它表示一个包含以分号分隔的cookies列表的string,这个name=value又是name=value对。 在每个分号之后似乎有一个单独的空格。
  3. String.prototype.match() – 如果找不到匹配项,则返回null 。 当find匹配项时返回一个数组,并且index [1]处的元素是第一个匹配组的值。

正则expression式注释:

  1. (?:xxxx) – 形成一个不匹配的组。
  2. ^ – 匹配string的开头。
  3. | – 为团队分开了不同的模式。
  4. ;\\s* – 匹配一个分号,后跟零个或多个空格字符。
  5. = – 匹配一个等号。
  6. (xxxx) – 形成一个匹配组。
  7. [^;]* – 匹配除分号以外的零个或多个字符。 这意味着它将匹配字符,但不包括分号或string的末尾。

我已经修改了Jonathan在这里提供的函数,通过使用正则expression式,你可以通过它的名字得到一个cookie值,如下所示:

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

如果返回空string,则意味着该cookie存在但没有值,如果返回false,则该cookie不存在。 我希望这有帮助。

我知道这是一个古老的问题,但我也遇到了这个问题。 只是为了logging,在开发人员的Mozilla网页有一个小API。

Yoy只能使用JS获取任何名称的Cookie。 代码也是更清洁的恕我直言(长线除外,我相信你可以轻松修复)。

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

如注释中所述,请注意,此方法假定密钥和值使用encodeURIComponent()编码。 如果cookie的键和值没有被编码,则移除decode&encodeURIComponent()。

总是运作良好:

 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() + ';'; } 

没有要求的jQuery或任何东西。 纯粹的老好的JavaScript。

使用object.defineProperty

有了这个,你可以很容易地访问cookie

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

从现在开始你可以做:

 alert( Cookies.obligations ); 

这也会自动更新,所以如果你改变一个cookie, Cookies也会改变。

在我看来,你可以将cookie键值对分割成一个数组,并将search结果作为基础:

 var obligations = getCookieData("obligations"); 

其中运行以下内容:

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

小提琴: http : //jsfiddle.net/qFmPc/

甚至可能还有以下内容:

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

在我的项目中,我使用以下function来按名称访问Cookie

 function getCookie(cookie) { return document.cookie.split(';').reduce(function(prev, c) { var arr = c.split('='); return (arr[0].trim() === cookie) ? arr[1] : prev; }, undefined); } 

kirlich给了一个很好的解决scheme。 但是,当有两个具有相似名称的cookie值时,它会失败,下面是对这种情况的简单修复:

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

由javascript设置

 document.cookie = 'cookiename=tesing'; 

通过jquery获取

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

获取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] : ""; } 

我的解决办法是:

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

这个函数使用Underscorejs _.find函数。 如果cookie名称不存在,则返回undefined

达斯汀·迪亚兹(真棒)把这个在JS中的所有时间有用的function。 用他自己的话说:

“我讨厌在JavaScript中设置Cookie的DOM实现,在PHP中它非常容易,而且很容易就有一个主要原因,就像下面的函数”…

请参阅: http : //www.dustindiaz.com/top-ten-javascript

 function getCookie(name) { var start = document.cookie.indexOf(name + "="); var len = start + name.length + 1; if ((!start) && (name != document.cookie.substring(0, name.length))) { return null; } if (start == -1) return null; var end = document.cookie.indexOf(';', len); if (end == -1) end = document.cookie.length; return unescape(document.cookie.substring(len, end)); } 

这里已经有了很好的答案,但是这里是我自己的解决scheme:

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

用法:`

  getcookie('session_id'); // gets cookie with name session_id 

这是一个很短的版本

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

请注意,我使用了ES6的模板string来组成正则expression式。

 function getCookie(name) { var pair = document.cookie.split('; ').find(x => x.startsWith(name+'=')); if (pair) return pair.split('=')[1] } 

以下函数将返回所需cookie key-value对,其中key是cookie名称, value将是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; }; 

Cookie示例: 示例 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; } } 

用json或xml存储数组和对象

我会做这样的事情:

 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; },{}) } 

这将返回您的cookie作为一个对象。

然后你可以这样称呼它:

 getCookie(document.cookie)['shares'] 

我喜欢使用闭包来获取名称的cookie值。 下面的closures将允许您通过名称获取cookie值,但只会在更新后parsingcookiestring。

您可以使用以下方法检索cookie的值:

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

码:

 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 ); } }; })(); 

一种function性的方法来查找现有的Cookie。 它返回一个数组,所以它支持多个同名的事件。 它不支持部分关键字匹配,但是用正则expression式replacefilter中的===是微不足道的。

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