用JavaScript读取cookie的最短、准确且跨浏览器兼容的方法是什么?
通常,在构建独立脚本(在那里我不能有任何外部依赖)时,我发现自己添加了一个读取cookie的函数,并且通常回退到QuirksMode.org readCookie()方法(280字节,缩小216字节)。
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;
}
它确实起到了作用,但它很丑,而且每次都增加了相当多的膨胀。
jQuery的方法。Cookie使用类似这样的内容(经过修改,165字节,125字节缩小):
function read_cookie(key)
{
var result;
return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? (result[1]) : null;
}
请注意,这不是一场“代码高尔夫”比赛:我对减小readCookie函数的大小感兴趣,并确保我拥有的解决方案是有效的。
我的建议是:
function getCookie(name) {
const cookieDict = document.cookie.split(';')
.map((x)=>x.split('='))
.reduce((accum,current) => { accum[current[0]]=current[1]; return accum;}, Object());
return cookieDict[name];
}
上面的代码生成一个dict,该dict将cookie存储为键-值对(即cookidict),然后访问属性名以检索cookie。
这可以有效地表达为一句俏皮话,但这只适用于勇敢的人:
document.cookie.split(';').map((x)=>x.split('=')).reduce((accum,current) => { accum[current[0]]=current[1]; return accum;}, {})[name]
最好的方法是在页面加载时生成cookieDict,然后在整个页面生命周期中通过调用cookieDict['cookiename']来访问各个cookie。
我的建议是:
function getCookie(name) {
const cookieDict = document.cookie.split(';')
.map((x)=>x.split('='))
.reduce((accum,current) => { accum[current[0]]=current[1]; return accum;}, Object());
return cookieDict[name];
}
上面的代码生成一个dict,该dict将cookie存储为键-值对(即cookidict),然后访问属性名以检索cookie。
这可以有效地表达为一句俏皮话,但这只适用于勇敢的人:
document.cookie.split(';').map((x)=>x.split('=')).reduce((accum,current) => { accum[current[0]]=current[1]; return accum;}, {})[name]
最好的方法是在页面加载时生成cookieDict,然后在整个页面生命周期中通过调用cookieDict['cookiename']来访问各个cookie。
使用cwolves的答案,但不使用闭包或预先计算的哈希:
// Golfed it a bit, too...
function readCookie(n){
var c = document.cookie.split('; '),
i = c.length,
C;
for(; i>0; i--){
C = c[i].split('=');
if(C[0] == n) return C[1];
}
}
...和缩减……
function readCookie(n){var c=document.cookie.split('; '),i=c.length,C;for(;i>0;i--){C=c[i].split('=');if(C[0]==n)return C[1];}}
...等于127字节。