在JavaScript中按名称获取cookie的最佳方法是什么?

6

我正在使用原型,并且找不到任何内置扩展来设置或检索cookie。在谷歌搜索了一会儿之后,我看到了几种不同的方法。我想知道在JavaScript中获取cookie的最佳方法是什么?

4个回答

9
我使用这个例程:
function ReadCookie(name)
{
  name += '=';
  var parts = document.cookie.split(/;\s*/);
  for (var i = 0; i < parts.length; i++)
  {
    var part = parts[i];
    if (part.indexOf(name) == 0)
      return part.substring(name.length)
  }
  return null;
}

相当不错。

2
如果有其他人需要,我已经修改了Diodeus的代码,以解决PhiLho的担忧,即在尝试获取cookie值时出现部分匹配的情况。
function getCookie(c_name) {
    var nameEQ = c_name + '=';
    var c_start = 0;
    var c_end = 0;
    if (document.cookie.substr(0, nameEQ.length) === nameEQ) {
        return document.cookie.substring(nameEQ.length, document.cookie.indexOf(';', nameEQ.length));
    } else {
        c_start = document.cookie.indexOf('; ' + nameEQ);
        if(c_start !== -1){
            c_start += nameEQ.length + 2;
            c_end = document.cookie.indexOf(';', c_start);
            if (c_end === -1) {c_end = document.cookie.length;}
            return document.cookie.substring(c_start, c_end);
        }
    }
    return null;
}

我最近还建立了一个更紧凑的RegExp,应该也能起作用:
function getCookie(c_name){
    var ret = window.testCookie.match(new RegExp("(?:^|;)\\s*"+c_name+"=([^;]*)"));
    return (ret !== null ? ret[1] : null);
}

我进行了一些速度测试,似乎表明在 PhiLo、QuirksMode 和这两个实现中,上面的非 RegExp 版本(使用 indexOf 非常快,这并不是很出人意料)是最快的。http://jsperf.com/cookie-fetcher

在你的新函数中,“c_name”参数放在哪里? - ermannob

2

每当我需要访问它时,我使用document.cookie,基本上就像那篇文章中所概述的那样。要注意的是,我从未使用过prototype,因此可能有更简单的方法,你只是还没有发现。


是的,我以前也使用过quirksmode的get/set cookie代码。 - EvilSyn
我也会推荐使用quirksmode的cookie函数。 - Prestaul

-2

我使用这个。它一直很可靠:

function getCookie(c_name) {
if (document.cookie.length>0)
  {
  c_start=document.cookie.indexOf(c_name + "=")
  if (c_start!=-1)
    { 
    c_start=c_start + c_name.length+1 
    c_end=document.cookie.indexOf(";",c_start)
    if (c_end==-1) c_end=document.cookie.length
    return unescape(document.cookie.substring(c_start,c_end))
    } 
  }
return ""

}


6
如果您搜索BEL并且有一个名为REBEL的Cookie,那么可能会出现问题,不是吗? - PhiLho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接