Получить куки по имени

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

Теперь у меня есть 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]);
    }
 }
 user139500124 мая 2012 г., 04:43
Нет, как я мог это сделать?
 Soleil05 июн. 2018 г., 17:20
Возможно, вы захотите принять ответ: ваш вопрос все еще помечен как неотвеченный.
 webLacky3rdClass24 мая 2012 г., 04:37
есть ли смола, которую вы не просто составляете в виде массива?
 Ciro Santilli 新疆改造中心 六四事件 法轮功15 мая 2016 г., 11:17
 webLacky3rdClass24 мая 2012 г., 04:38
делая печенье массив, я должен сказать.

Ответы на вопрос(29)

https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie

document.cookie = "test1=Hello";
document.cookie = "test2=World";

var cookieValue = document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");

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

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

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

 20 окт. 2017 г., 00:26
Лучший ответ с сегодняшнего дня. Использует функции ES6. Это 2017 год, и люди все еще используютvar, + объединить и т. д.

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

When the cookie is the last cookie. In this case there will not be a semicolon after the cookie value. When another cookie name ends with the name being looked up. For example, you are looking for the cookie named "one", and there is a cookie named "done". When the cookie name includes characters that are not interpreted as themselves when used in a regular expression unless they are preceded by a backslash.

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

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 пустое.

Заметки:

This function assumes cookie names are case sensitive. document.cookie - When this appears on the right-hand side of an assignment, it represents a string containing a semicolon-separated list of cookies, which in turn are name=value pairs. There appears to be a single space after each semicolon. String.prototype.match() - Returns null when no match is found. Returns an array when a match is found, and the element at index [1] is the value of the first matching group.

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

(?:xxxx) - forms a non-matching group. ^ - matches the start of the string. | - separates alternative patterns for the group. ;\\s* - matches one semi-colon followed by zero or more whitespace characters. = - matches one equal sign. (xxxx) - forms a matching group. [^;]* - matches zero or more characters other than a semi-colon. This means it will match characters up to, but not including, a semi-colon or to the end of the string.
 19 июл. 2016 г., 18:12
Если это универсальный инструмент, он должен либо экранировать имя, либо выдать ошибку, если имя не может быть встроено непосредственно в регулярное выражение. Люди, которые знают ограничения своего приложения, могут удалить побег или охрану.
 23 дек. 2015 г., 22:12
Этот ответ - лучшая и самая короткая функция, которая работает во всех случаях без ложных совпадений. У этого также есть лучшее объяснение того, как это работает. Тем не менееescape Функция не объясняется, и я думаю, что если автор создал cookie, он будет знать, нужно ли экранировать имя или нет. Поэтому я бы предпочел более короткую функцию:function getCookie(name) { var match = document.cookie.match(RegExp('(?:^|;\\s*)' + name + '=([^;]*)')); return match ? match[1] : null; }

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

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

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

logged = true - замените это на 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);
}

document.cookie = 'cookiename=tesing';

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

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

alert(value);
 08 мая 2018 г., 08:39
Ух ты ... какая важная информация ранее отсутствовала .... Но по предоставленной вами ссылке кажется, что владелец библиотеки решил, что ему лучше удалить зависимость jquery.
 27 апр. 2017 г., 12:30
Похоже, код get by jquery не работает.
 07 мая 2018 г., 16:58
@cytsunny - это потому, что для этого вам нужен плагин jquery cookie.
 28 мар. 2017 г., 10:30
Как просто установить время выполнения с помощью get cookie ...

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']

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)

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

вставляю решение для установки и извлечения файлов cookie изMDN (здесьJSfiddle

    document.cookie = "test1=Hello";
    document.cookie = "test2=World";

    var cookieValue = document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");

    function alertCookieValue() {
      alert(cookieValue);
    }

В конкретном случае вы бы использовали следующую функцию

    function getCookieValue() {
      return document.cookie.replace(/(?:(?:^|.*;\s*)obligations\s*\=\s*([^;]*).*$)|^.*$/, "$1");
    }

Обратите внимание, что я заменил только "test2" из примера с «обязательствами».

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

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

вы могли бы разделить пары ключ-значение 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;
}

Скрипки: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;
}
 24 мая 2012 г., 04:59
Есть ли способ использовать document.cookie.indexOf (name) и сравнить?
 24 мая 2012 г., 05:13
@AndrejHefner Вы можете, хотя это будет соответствовать подстрок. Поэтому, если у вас есть имя cookie-файла «foobar» и один с именем «bar», вы можете запутаться в «bar» & quot; в & quot; foobar & quot; с ключом «бар».
 12 нояб. 2013 г., 20:25
Второй метод имеет ошибку, из-за которой он не может найти последнее значение cookie, поскольку он всегда ищет a; в конце. Версия исправления будет:function getCookieData( name ) { var patrn = new RegExp( "(?:^| )" + name + "=(.*?)(?:;|$)" ); if ( match = (document.cookie.match(patrn) )) return match[1]; return false; }
 24 мая 2012 г., 05:29
@AndrejHefner Пожалуйста, посмотрите более поздний метод, который должен быть быстрее, так как он проверяет строку на совпадение.

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

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

куки:

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

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

 19 окт. 2015 г., 20:39
Это может иметь ложные совпадения, если два куки имеют одинаковый суффикс. Это будет соответствовать обоимxyz=value а такжеabcxyz=value когдаname = xyz.
 28 сент. 2015 г., 10:25
Это был тот самый ответ, который я искал. Regex имеет лучшую поддержку, расширяемость и производительность. Это должно иметь больше голосов.
 13 мая 2017 г., 00:38
@ScottJungwirth Да, но затем вы должны обновить инструкцию return, чтобы вернуть соответствие [2];
 20 окт. 2015 г., 19:21
unescape((document.cookie.match(key + '=([^;].+?)(;|$)') || [])[1] || ''); Модифицированная версияGlize/dom/Cookies
 07 янв. 2016 г., 02:13
обновить Regex доnew RegExp('(^| )' + name + '=([^;]+)') чтобы избежать проблемы, поднятой @BrentWashburne. Также я сделал тест jsperf для этого и получил ответ с наибольшим количеством голосов, этот немного выше, но определенно меньше кода и легче следовать:jsperf.com/simple-get-cookie-by-name

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] : "";
}

однако вот мое собственное решение:

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

мени. Приведенное ниже закрытие позволит вам получить значение 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 );
        }  
    };
})();

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

Walkthrough

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

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

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

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

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

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

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

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

 24 дек. 2013 г., 14:08
Пользователь @ user3132564 попытался отредактировать это, но на самом деле это комментарий: этот метод возвращает неправильное значение при поиске суффикса файла cookie - если значением document.cookie является & quot; FirstName = John & quot; и вы вызываете getCookie («Имя»), вы «вернетесь», Джон ». несмотря на то, что нет файлов cookie с таким именем. Он также не работает, если имя одного файла cookie является суффиксом другого, если document.cookie имеет значение & quot; Имя = John; LastName = Doe & quot ;, вызывающий split (& quot; Name = & quot;) возвращает массив с тремя строками, а метод не возвращает правильное значение для getCookie (& quot; Name & quot;).
 19 нояб. 2015 г., 20:36
@ NathanJ. Брауэр, ты прав. Обновлен для решения этой проблемы давно, но сделал заметку только в журнале изменений, а не в комментариях.
 13 июл. 2015 г., 20:11
@DennisJaheruddin - похоже, проблема с суффиксами была исправлена.
 25 апр. 2014 г., 20:15
Предупреждение о реализации в этом ответе: если существует более одного cookie с одним и тем же именем, то значение cookie не возвращается. Например, если файл cookie с именем stackToken установлен для доменов .stackexchange.com, а также programmers.stackexchange.com, то при вызове getCookie (& quot; stackToken & quot;) не будет возвращено ни одно значение - parts.length будет больше, чем 2. Если вы знаете, что все значения файлов cookie для одного и того же имени (но для разных доменов и путей) будут одинаковыми, см. Принятый ответ здесь:stackoverflow.com/questions/5639346/…

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

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

которую Джонатан предоставил здесь, используя регулярное выражение, вы можете получить значение 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 не существует. Надеюсь, это поможет.

что это старый вопрос, но я тоже сталкивался с этой проблемой. Просто для записи, есть немного API в разработчикахвеб-страница Mozilla.

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

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

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

 29 мар. 2015 г., 01:06
@JohnS Мы могли бы просто удалить decodeURIComponent, верно? (Если бы мы не использовали его для установки файла cookie?) Будет ли он работать?
 29 мар. 2015 г., 01:16
Да, только что удалили decodeURI, и это регулярное выражение является монстром. Спасибо Марк, проголосовал!
 10 нояб. 2014 г., 16:18
Просто имейте в виду, что метод предполагает, что имя и значение файла cookie были закодированы с использованиемencodeURIComponent() когда был установлен cookie, что будет истинно, если вы используете функцию компаньона для установки cookie, но не всегда так.test

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() + ';';
}

No requirements for jQuery or anything. Pure old good JavaScript.

 29 янв. 2016 г., 15:33
Pure JS всегда хорош :)
Use object.defineProperty

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 тоже изменится.

 15 янв. 2017 г., 07:54
@ Сэмюэль Эльх правильно, но вы также можете использовать .trim () вместо замены (/ / g, 'apos;)
 17 июл. 2016 г., 16:55
Отлично! за исключением того, что он не будет работать для объектов, которые имеют некоторые символы, такие как тире (как имена файлов cookie), и при разбиении объекты сначала имеют пустое пространство, поэтому я идуcookies[(cookie.split("=")[0]).replace(/ /g,'')] = .., Спасибо!!

ельным значениям. С этим вы можете передать 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;
        }  

пример 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

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'

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

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

var obligations = getCookie('obligations');

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: '/' });

Удалить куки:

$.removeCookie('obligations');
 02 окт. 2015 г., 14:28
@Cozzbie, вероятно, включает в себя внешнюю библиотеку (тем самым добавляя еще один http-запрос), чтобы просто получить значение cookie, что является излишним излишним.
 15 нояб. 2017 г., 01:31
новая версия -github.com/js-cookie/js-cookie
 03 нояб. 2014 г., 09:32
Не уверен, почему это не было признано лучшим ответом на самом деле. Да, это jQuery, а не javascript, но в то же время ЭТО !!!!

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

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

Ваш ответ на вопрос