Получить файл cookie по имени

У меня есть получатель, чтобы получить значение из куки.

Теперь у меня есть 2 куки файла с именем shares= и с названием obligations=.

Я хочу сделать этот геттер только для того, чтобы получить значения из файла cookie обязательств.

Как мне это сделать? Таким образом, for разбивает данные на отдельные значения и помещает их в массив.

 function getCookie1() {
    // What do I have to add here to look only in the "obligations=" cookie? 
    // Because now it searches all the cookies.

    var elements = document.cookie.split('=');
    var obligations= elements[1].split('%');
    for (var i = 0; i < obligations.length - 1; i++) {
        var tmp = obligations[i].split('$');
        addProduct1(tmp[0], tmp[1], tmp[2], tmp[3]);
    }
 }

Ответ 1

Один подход, который позволяет избежать итерации по массиву, будет:

function getCookie(name) {
  var value = "; " + document.cookie;
  var parts = value.split("; " + name + "=");
  if (parts.length == 2) return parts.pop().split(";").shift();
}

Пошаговое

Разделение строки на токен приведет к получению либо массива с одной строкой (то же значение), если токен не существует в строке, либо массив с двумя строками, если маркер найден в строке.

Первый (левый) элемент - это строка того, что было перед токеном, а вторая (справа) - это то, что было после токена.

(ПРИМЕЧАНИЕ: в случае, если строка начинается с токена, первый элемент представляет собой пустую строку)

Учитывая, что файлы cookie хранятся следующим образом:

"{name}={value}; {name}={value}; ..."

чтобы получить определенное значение cookie, нам просто нужно получить строку, которая после "; {name} =" и перед следующей ";". Прежде чем мы сделаем какую-либо обработку, мы добавим строку cookie с символом ";", чтобы каждое имя файла cookie, включая первое, было заключено в ";" и "=":

"; {name}={value}; {name}={value}; ..."

Теперь мы можем сначала разделить на "; {name} =", и если токен найден в строке cookie (т.е. у нас есть два элемента), мы получим второй элемент, являющийся строкой, которая начинается с нашего файла cookie стоимость. Затем мы вытаскиваем это из массива (т.е. Pop) и повторяем тот же процесс, но теперь с ";" как токен, но на этот раз вытащить левую строку (т.е. сдвиг), чтобы получить фактическое значение токена.

Ответ 2

Я бы предпочел использовать одно совпадение с регулярным выражением в куки:

window.getCookie = function(name) {
  var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
  if (match) return match[2];
}

Улучшено благодаря Скотту Юнгвирту в комментариях.

Ответ 3

используйте файл cookie script:

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

затем назовите его:

var value = readCookie('obligations');

я украл код выше с страницы cookie quirksmode. вы должны прочитать его.

Ответ 4

Если вы используете jQuery, я рекомендую вам использовать этот плагин:

https://github.com/carhartl/jquery-cookie
https://github.com/carhartl/jquery-cookie/blob/master/jquery.cookie.js

<script type="text/javascript"
 src="//cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js">

Итак, вы можете читать cookie следующим образом:

var value = $.cookie("obligations");

Также вы можете написать файл cookie:

$.cookie('obligations', 'new_value');
$.cookie('obligations', 'new_value', { expires: 14, path: '/' });

Удалить файл cookie:

$.removeCookie('obligations');

Ответ 5

Методы в некоторых других ответах, которые используют регулярное выражение, не охватывают все случаи, в частности:

  1. Когда файл cookie является последним файлом cookie. В этом случае не будет точки с запятой после значения cookie.
  2. Когда имя другого файла cookie заканчивается именем, которое ищется. Например, вы ищете файл cookie с именем "one", и есть файл cookie с именем "done".
  3. Когда имя файла cookie содержит символы, которые не интерпретируются как сами по себе при использовании в регулярном выражении, если им не предшествует обратная косая черта.

Следующий метод обрабатывает эти случаи:

function getCookie(name) {
    function escape(s) { return s.replace(/([.*+?\^${}()|\[\]\/\\])/g, '\\$1'); };
    var match = document.cookie.match(RegExp('(?:^|;\\s*)' + escape(name) + '=([^;]*)'));
    return match ? match[1] : null;
}

Это вернет null если cookie не найден. Он вернет пустую строку, если значение cookie пустое.

Заметки:

  1. Эта функция предполагает, что имена файлов cookie чувствительны к регистру.
  2. document.cookie - Когда это появляется в правой части назначения, оно представляет строку, содержащую разделенный точкой с запятой список файлов cookie, которые, в свою очередь, являются парами name=value. Кажется, что после каждой точки с запятой есть один пробел.
  3. String.prototype.match() - возвращает null, если совпадений не найдено. Возвращает массив при обнаружении совпадения, а элемент с индексом [1] является значением первой совпадающей группы.

Примечания регулярного выражения:

  1. (?:xxxx) - образует несоответствующую группу.
  2. ^ - соответствует началу строки.
  3. | - отделяет альтернативные шаблоны для группы.
  4. ;\\s* - соответствует одной точке с запятой, за которой следует ноль или более пробельных символов.
  5. = - соответствует одному знаку равенства.
  6. (xxxx) - образует подходящую группу.
  7. [^;]* - соответствует нулю или большему количеству символов, кроме точки с запятой. Это означает, что он будет соответствовать символам до, но не включая точку с запятой или до конца строки.

Ответ 6

Я изменил функцию, которую предоставил Джонатан здесь, используя регулярное выражение, вы можете получить значение cookie с его именем следующим образом:

function getCookie(name){
    var pattern = RegExp(name + "=.[^;]*")
    matched = document.cookie.match(pattern)
    if(matched){
        var cookie = matched[0].split('=')
        return cookie[1]
    }
    return false
}

Если он возвращает пустую строку, это означает, что файл cookie существует, но не имеет значения, если он возвращает false, то cookie не существует. Надеюсь, это поможет.

Ответ 7

Спустя 4 года ES6 значительно упростила версию.

function getCookie(name) {
  let cookie = {};
  document.cookie.split(';').forEach(function(el) {
    let [k,v] = el.split('=');
    cookie[k.trim()] = v;
  })
  return cookie[name];
}

Я также создал суть, чтобы использовать его в качестве объекта Cookie. например, Cookie.set(name,value) и Cookie.get(name)

Это читает все куки вместо сканирования. Это нормально для небольшого количества печенья.

Ответ 8

Я знаю, что это старый вопрос, но я столкнулся с этой проблемой. Только для записи, существует несколько API-интерфейсов в веб-странице mozilla.

Yoy может получить любой cookie по имени, используя только JS. Код также более чистый IMHO (за исключением длинной строки, что я уверен, что вы можете легко исправить).

function getCookie(sKey) {
    if (!sKey) { return null; }
    return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
}

Как указано в комментариях, следует помнить, что этот метод предполагает, что ключ и значение были закодированы с использованием encodeURIComponent(). Удалите декодирование и encodeURIComponent(), если ключ и значение cookie не были закодированы.

Ответ 9

Используйте object.defineProperty

С этим вы можете легко получить доступ к файлам cookie

Object.defineProperty(window, "Cookies", {
    get: function() {
        return document.cookie.split(';').reduce(function(cookies, cookie) {
            cookies[cookie.split("=")[0]] = unescape(cookie.split("=")[1]);
            return cookies
        }, {});
    }
});

Отныне вы можете просто сделать:

alert( Cookies.obligations );

Это также будет автоматически обновляться, поэтому, если вы измените файл cookie, значение Cookies тоже изменится.

Ответ 10

всегда хорошо работает:

function getCookie(cname) {
    var name = cname + "=",
        ca = document.cookie.split(';'),
        i,
        c,
        ca_length = ca.length;
    for (i = 0; i < ca_length; i += 1) {
        c = ca[i];
        while (c.charAt(0) === ' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name) !== -1) {
            return c.substring(name.length, c.length);
        }
    }
    return "";
}

function setCookie(variable, value, expires_seconds) {
    var d = new Date();
    d = new Date(d.getTime() + 1000 * expires_seconds);
    document.cookie = variable + '=' + value + '; expires=' + d.toGMTString() + ';';
}

Нет требований для jQuery или чего-либо еще. Чистый старый хороший JavaScript.

Ответ 11

kirlich дал хорошее решение. Однако это не удается, когда есть два значения cookie с похожими именами, вот простое исправление для этой ситуации:

function getCookie(name) {
  var value = "; " + document.cookie;
  var parts = value.split("; " + name + "=");
  if (parts.length >= 2) return parts.pop().split(";").shift();
}

Ответ 12

Простая функция для Get cookie с именем cookie:

function getCookie(cn) {
    var name = cn+"=";
    var allCookie = decodeURIComponent(document.cookie).split(';');
    var cval = [];
    for(var i=0; i < allCookie.length; i++) {
        if (allCookie[i].trim().indexOf(name) == 0) {
            cval = allCookie[i].trim().split("=");
        }   
    }
    return (cval.length > 0) ? cval[1] : "";
}

Ответ 13

Мне кажется, вы можете разделить пары ключ-значение cookie на массив и основывать свой поиск на этом:

var obligations = getCookieData("obligations");

Выполняется следующее:

function getCookieData( name ) {
    var pairs = document.cookie.split("; "),
        count = pairs.length, parts; 
    while ( count-- ) {
        parts = pairs[count].split("=");
        if ( parts[0] === name )
            return parts[1];
    }
    return false;
}

Fiddle: http://jsfiddle.net/qFmPc/

Или, возможно, даже следующее:

function getCookieData( name ) {
    var patrn = new RegExp( "^" + name + "=(.*?);" ),
        patr2 = new RegExp( " " + name + "=(.*?);" );
    if ( match = (document.cookie.match(patrn) || document.cookie.match(patr2)) )
        return match[1];
    return false;
}

Ответ 14

В моих проектах я использую следующую функцию для доступа к файлам cookie по имени

function getCookie(cookie) {
    return document.cookie.split(';').reduce(function(prev, c) {
        var arr = c.split('=');
        return (arr[0].trim() === cookie) ? arr[1] : prev;
    }, undefined);
}

Ответ 15

Вот довольно короткая версия

 function getCookie(n) {
    let a = `; ${document.cookie}`.match(`;\\s*${n}=([^;]+)`);
    return a ? a[1] : '';
}

Обратите внимание, что я использовал строки шаблонов ES6 для создания выражения регулярного выражения.

Ответ 16

function getCookie(name) {
    var pair = document.cookie.split('; ').find(x => x.startsWith(name+'='));
    if (pair)
       return pair.split('=')[1]
}

Ответ 17

устанавливается javascript

document.cookie = 'cookiename=tesing';

получить с помощью jquery с плагином jquery-cookie

var value = $.cookie("cookiename");

alert(value);

Ответ 18

Здесь есть хорошие ответы на получение cookie, но вот мое собственное решение:

function getcookie(cookiename){
var cookiestring  = document.cookie;
var cookiearray = cookiestring.split(';');
for(var i =0 ; i < cookiearray.length ; ++i){ 
    if(cookiearray[i].trim().match('^'+cookiename+'=')){ 
        return cookiearray[i].replace(`${cookiename}=`,'').trim();
    }
} return null;
}

использование: `

     getcookie('session_id');
   // gets cookie with name session_id

Ответ 19

Вы можете использовать библиотеку js-cookie для получения и установки файлов cookie JavaScript.

Включить в ваш HTML:

<script src="https://cdn.jsdelivr.net/npm/[email protected]/src/js.cookie.min.js"></script>

Чтобы создать Cookie:

Cookies.set('name', 'value');

Чтобы прочитать Cookie:

Cookies.get('name'); // => 'value'

Ответ 21

Мое решение таково:

function getCookieValue(cookieName) {
    var ca = document.cookie.split('; ');
    return _.find(ca, function (cookie) {
        return cookie.indexOf(cookieName) === 0;
    });
}

Эта функция использует функцию Underscorejs _.find. Возвращает undefined, если имя файла cookie не существует

Ответ 22

Дастин Диаз (удивительный) оценил это все свое полезное время в JS. По его собственным словам:

"Я ненавижу реализации DOM для настройки файлов cookie в JavaScript. На PHP это так просто, и это легко по одной основной причине, они работают так же, как функция ниже"...

см. http://www.dustindiaz.com/top-ten-javascript

function getCookie(name) {

  var start = document.cookie.indexOf(name + "=");

  var len = start + name.length + 1;

  if ((!start) && (name != document.cookie.substring(0, name.length))) {

    return null;

  }

  if (start == -1) return null;

  var end = document.cookie.indexOf(';', len);

  if (end == -1) end = document.cookie.length;

  return unescape(document.cookie.substring(len, end));

}

Ответ 23

Я сделал это так. так что я получаю объект для доступа к отдельным значениям. С этим u может передать cookie родительскому, а затем вы можете получить доступ к своим значениям с помощью таких клавиш, как

var cookies=getCookieVal(mycookie);
alert(cookies.mykey);
function getCookieVal(parent) {
            var cookievalue = $.cookie(parent).split('&');
            var obj = {};
            $.each(cookievalue, function (i, v) {
                var key = v.substr(0, v.indexOf("="));
                var val = v.substr(v.indexOf("=") + 1, v.length);

                obj[key] = val;

            });
            return obj;
        }  

Ответ 24

Очевидно, MDN никогда не слышал о классе символов регулярных выражений границы слова \b, который соответствует \w+, ограниченному с обеих сторон \w+:

getCookie = function(name) {
    var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
    return r ? r[1] : null;
};

var obligations = getCookie('obligations');

Ответ 25

Функциональный подход для поиска существующих файлов cookie. Он возвращает массив, поэтому он поддерживает множественные вхождения с тем же именем. Он не поддерживает частичное совпадение ключей, но это тривиально, чтобы заменить === в фильтре на регулярное выражение.

function getCookie(needle) {
    return document.cookie.split(';').map(function(cookiestring) {
        cs = cookiestring.trim().split('=');

        if(cs.length === 2) {
            return {'name' : cs[0], 'value' : cs[1]};
        } else {
            return {'name' : '', 'value' : ''};
        }
    })
    .filter(function(cookieObject) { 
        return (cookieObject.name === needle);
    });
}

Ответ 26

Если вам просто нужно проверить, существуют ли какие-либо куки, просто сделайте это:

document.cookie.split('logged=true').length == 2

если cookie logged = true существует, вы получите 2, если не 1.

logged = true - замените это на cookie имя = значение или просто имя

Ответ 27

Следующая функция вернет пару key-value необходимого файла cookie, где key - имя файла cookie, а value будет значением cookie.

/**
 * Returns cookie key-value pair
 */
var getCookieByName = function(name) {
    var result = ['-1','-1'];
    if(name) {
        var cookieList = document.cookie.split(';');
        result = $.grep(cookieList,function(cookie) { 
            cookie = cookie.split('=')[0];
            return cookie == name;
        });
    }
    return result;
};

Ответ 28

Пример файлов cookie: пример JS:

document.cookies = {
   create : function(key, value, time){
     if (time) {
         var date = new Date();
         date.setTime(date.getTime()+(time*24*60*60*1000));
         var expires = "; expires="+date.toGMTString();
     }
     else var expires = "";
     document.cookie = key+"="+value+expires+"; path=/";
   },
   erase : function(key){
     this.create(key,"",-1);
   },
   read : function(key){
     var keyX = key + "=";
     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(keyX) == 0) return   c.substring(keyX.length,c.length);
     }
     return null;
   }
}

Храните массивы и объекты с помощью json или xml

Ответ 29

Я бы сделал что-то вроде этого:

function getCookie(cookie){
  return cookie
    .trim()
    .split(';')
    .map(function(line){return line.split(',');})
    .reduce(function(props,line) {
      var name = line[0].slice(0,line[0].search('='));
      var value = line[0].slice(line[0].search('='));
      props[name] = value;
      return props;
    },{})
}

Это вернет ваш файл cookie как объект.

И тогда вы можете вызвать его так:

getCookie(document.cookie)['shares']

Ответ 30

Мне нравится использовать закрытие для получения значений cookie по имени. Закрытие ниже позволит вам получить значение cookie по имени, но будет только анализировать строку cookie, если она была обновлена.

Вы можете получить значение файла cookie со следующим:

var foo = cookies.get( "bar" );

код:

var cookies = ( function() {
    var cookieString = null;
    var cookieArray = [];

    function getValOf( name ) {
        if ( newCookies() ) {
            parseCookieString()
        }
        return cookieArray[ name ];
    }

    // Check if new cookies have been added
    function newCookies() {
        return cookieString === document.cookie;
    }

    function parseCookieString() {
        cookieString = document.cookie;

        // Separate cookies
        var cookies = cookieString.split( ";" );

        // Empty previous cookies
        cookieArray = [];

        // Update cookieArray with new name-value pairs
        for ( var i in cookies ) {

            // Separate name and value
            var nameVal = cookies[ i ].split( "=" );
            var name = nameVal[ 0 ].trim();
            var value = nameVal[ 1 ].trim();

            // Add cookie name value pair to dictionary
            cookieArray[ name ] = value;
        }
    }

    return {

        /**
         * Returns value or undefined
         */
        get: function( name ) {
            return getValOf( name );
        }  
    };
})();