Какая самая короткая функция для чтения куки по имени в JavaScript? - PullRequest
174 голосов
/ 12 апреля 2011

Какой самый короткий, точный и совместимый с браузером метод чтения файлов cookie в JavaScript?

Очень часто при создании автономных сценариев (где я не могуу меня есть какие-то внешние зависимости), я обнаружил, что добавляю функцию для чтения куки-файлов и обычно использую метод QuirksMode.org readCookie() (280 байт, 216 минимизировано).

Он делает работу, но уродливо, и каждый раз добавляет немного вздутия.

Метод, который 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 и в том, чтобы решение, которое у меня есть, было действительным.

Ответы [ 13 ]

0 голосов
/ 07 августа 2017

Вот простейшее решение с использованием строковых функций javascript.

document.cookie.substring(document.cookie.indexOf("COOKIE_NAME"), 
                          document.cookie.indexOf(";", 
                          document.cookie.indexOf("COOKIE_NAME"))).
  substr(COOKIE_NAME.length);
0 голосов
/ 08 мая 2011

Используя ответ 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 байтов.

0 голосов
/ 01 мая 2011

(редактировать: сначала опубликована неверная версия .. и при этом нефункциональная. Обновлена ​​до текущей, которая использует непарамальную функцию, очень похожую на второй пример)

Хорошая идея в первом примере cwolves. Я использовал обе функции для довольно компактной функции чтения / записи cookie, которая работает в нескольких поддоменах. Подумал, что поделюсь, если кто-нибудь еще наткнется на эту тему в поисках этого.

(function(s){
  s.strToObj = function (x,splitter) {
    for ( var y = {},p,a = x.split (splitter),L = a.length;L;) {
      p = a[ --L].split ('=');
      y[p[0]] = p[1]
    }
    return y
  };
  s.rwCookie = function (n,v,e) {
    var d=document,
        c= s.cookies||s.strToObj(d.cookie,'; '),
        h=location.hostname,
        domain;
    if(v){
      domain = h.slice(h.lastIndexOf('.',(h.lastIndexOf('.')-1))+1);
      d.cookie = n + '=' + (c[n]=v) + (e ? '; expires=' + e : '') + '; domain=.' + domain + '; path=/'
    }
    return c[n]||c
  };
})(some_global_namespace)
  • Если вы ничего не передадите rwCookie, он получит все файлы cookie в хранилище файлов cookie
  • Передал rwCookie имя куки, он получает это значение cookie из хранилища
  • Передал значение cookie, он записывает cookie и помещает значение в хранилище
  • По умолчанию срок действия сессии, если вы не укажете один
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...