【问题标题】:What is the best way to get a cookie by name in JavaScript?在 JavaScript 中按名称获取 cookie 的最佳方法是什么?
【发布时间】:2010-09-13 05:49:53
【问题描述】:

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

【问题讨论】:

    标签: javascript cookies


    【解决方案1】:

    我用这个。它是可靠的:

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

    }

    【讨论】:

    • 如果您搜索 BEL 并且有一个名为 REBEL 的 cookie,可能会出现问题,不是吗?
    【解决方案2】:

    每当我需要访问它时,我都会使用document.cookie,基本上就是那篇文章中概述的方式。警告,我从来没有使用过原型,所以那里可能有更简单的方法,你只是没有遇到过。

    【讨论】:

    • 是的,我过去也使用过 quirksmode 的 get/set cookie 代码。
    • 我也会推荐 quirksmode 的 cookie 功能。
    【解决方案3】:

    我使用这个程序:

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

    效果很好。

    【讨论】:

      【解决方案4】:

      如果其他人需要它,我已修复 Diodeus's code 以解决 PhiLho's concern 在尝试获取 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”参数所在的新函数中?
      猜你喜欢
      • 1970-01-01
      • 2019-01-24
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2022-10-23
      • 2019-02-22
      相关资源
      最近更新 更多