在JavaScript中读取Cookie的最短,准确且跨浏览器兼容的方法是什么?
很多时候,在构建独立脚本时(我没有任何外部依赖项),我发现自己添加了一个读取cookie的函数,并且通常回退到QuirksMode.orgreadCookie()方法(280个字节,最小为216个)。
readCookie()
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; }
请注意, 这不是一场“ Code Golf”竞赛:我有理由减少我的readCookie函数的大小,并确保我的解决方案有效。
比目前最受好评的答案更简短,更可靠,更高效:
function getCookieValue(a) { var b = document.cookie.match('(^|[^;]+)\\s*' + a + '\\s*=\\s*([^;]+)'); return b ? b.pop() : ''; }
(编辑:'(^|;)\\s*'=> '(^|[^;]+)\\s*',以前仅适用于第一个cookie)
'(^|;)\\s*'
'(^|[^;]+)\\s*'
有关方法的一些注意事项:
regex方法不仅在大多数浏览器中最快,而且功能最短。此外,应该指出的是,根据正式规范(RFC2109),在document.cookie中用于分隔cookie的分号后的空格是可选的,并且可以提出不应依赖它的论点。另外,在等号(=)之前和之后都允许使用空格,并且可以提出这样的论点,即应将这一潜在的空格纳入任何可靠的document.cookie解析器。上面的正则表达式说明了上述两个空白条件。
这只会一次击打document.cookie。每个后续请求都是即时的。
(function(){ var cookies; function readCookie(name,c,C,i){ if(cookies){ return cookies[name]; } c = document.cookie.split('; '); cookies = {}; for(i=c.length-1; i>=0; i--){ C = c[i].split('='); cookies[C[0]] = C[1]; } return cookies[name]; } window.readCookie = readCookie; // or expose it however you want })();
除非你可以自由使用.forEach依赖于浏览器的内容,否则恐怕真的没有比此通用逻辑更快的方法了(即使那样你也不会节省太多)
.forEach
你自己的示例稍微压缩为120 bytes:
120 bytes
function read_cookie(k,r){return(r=RegExp('(^|; )'+encodeURIComponent(k)+'=([^;]*)').exec(document.cookie))?r[2]:null;}
如果将其设为110 bytes1个字母的函数名称,90 bytes则可以删除它encodeURIComponent。
110 bytes1
90 bytes
encodeURIComponent
我已经将其归结为73 bytes,但公平地说,是82 bytes在命名时readCookie以及102 bytes随后添加时encodeURIComponent:
73 bytes
82 bytes
readCookie
function C(k){return(document.cookie.match('(^|; )'+k+'=([^;]*)')||0)[2]}