按名称获取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式的答案中的方法并不能涵盖所有的情况,特别是:
- 当cookie是最后的cookie时。 在这种情况下,cookie值后面不会有分号。
- 当另一个cookie名称以查找的名字结束时。 例如,您正在查找名为“one”的cookie,并且有一个名为“done”的cookie。
- 当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。
笔记:
- 这个函数假定cookie的名字是区分大小写的 。
-
document.cookie
– 当它出现在赋值的右边时,它表示一个包含以分号分隔的cookies列表的string,这个name=value
又是name=value
对。 在每个分号之后似乎有一个单独的空格。 -
String.prototype.match()
– 如果找不到匹配项,则返回null
。 当find匹配项时返回一个数组,并且index[1]
处的元素是第一个匹配组的值。
正则expression式注释:
-
(?:xxxx)
– 形成一个不匹配的组。 -
^
– 匹配string的开头。 -
|
– 为团队分开了不同的模式。 -
;\\s*
– 匹配一个分号,后跟零个或多个空格字符。 -
=
– 匹配一个等号。 -
(xxxx)
– 形成一个匹配组。 -
[^;]*
– 匹配除分号以外的零个或多个字符。 这意味着它将匹配字符,但不包括分号或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); }); }
- Cookie混淆与FormsAuthentication.SetAuthCookie()方法
- Android HttpClient持久性cookies
- 在基于浏览器的应用程序中如何保存JWT以及如何使用它
- Cookiepath及其对子文件夹页面的可访问性
- Android WebView Cookie问题
- 使用PHP和CurlloginGoogle,Cookieclosures了吗?
- 在PHP中session_unset()和session_destroy()有什么区别?
- 如何在ASP.NET中configurationhttpOnlyCookies?
- localStorage,sessionStorage,session和cookies有什么区别?