572 Stimmen

Cookie nach Name abrufen

Ich habe einen Getter, um den Wert aus einem Cookie zu erhalten.

Jetzt habe ich 2 Kekse mit dem Namen shares= und mit dem Namen obligations= .

Ich möchte, dass dieser Getter nur die Werte aus dem Verpflichtungs-Cookie abruft.

Wie kann ich das tun? Also die for teilt die Daten in einzelne Werte auf und legt sie in einem Array ab.

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

711voto

kirlich Punkte 7142

Ein Ansatz, der es vermeidet, über ein Array zu iterieren, wäre folgender:

function getCookie(name) {
  const value = `; ${document.cookie}`;
  const parts = value.split(`; ${name}=`);
  if (parts.length === 2) return parts.pop().split(';').shift();
}

Durchgang

Die Aufteilung einer Zeichenkette nach Token erzeugt entweder ein Array mit einer Zeichenkette (gleicher Wert), falls Token nicht in einer Zeichenkette vorkommt, oder ein Array mit zwei Zeichenketten, falls Token in einer Zeichenkette vorkommt.

Das erste (linke) Element ist die Zeichenkette vor dem Token, das zweite (rechte) ist die Zeichenkette nach dem Token.

(HINWEIS: wenn die Zeichenkette mit einem Token beginnt, ist das erste Element eine leere Zeichenkette)

In Anbetracht der Tatsache, dass Cookies wie folgt gespeichert werden:

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

Um einen bestimmten Cookie-Wert abzurufen, müssen wir nur die Zeichenfolge nach "; {Name}=" und vor dem nächsten ";" abrufen. Vor der Verarbeitung wird der Cookie-Zeichenkette ein ";" vorangestellt, so dass jeder Cookie-Name, auch der erste, mit ";" und "=" eingeschlossen ist:

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

Nun können wir zunächst durch "; {Name}=" teilen, und wenn das Token in einer Cookie-Zeichenkette gefunden wird (d. h. wir haben zwei Elemente), ist das zweite Element eine Zeichenkette, die mit unserem Cookie-Wert beginnt. Dann ziehen wir diese Zeichenkette aus einem Array heraus (d.h. pop) und wiederholen den gleichen Prozess, aber jetzt mit ";" als Token, aber dieses Mal ziehen wir die linke Zeichenkette heraus (d.h. shift), um den tatsächlichen Token-Wert zu erhalten.

248voto

Jonathan Camenisch Punkte 3212

Ich würde es vorziehen, einen einzelnen regulären Ausdruck für den Cookie zu verwenden:

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

Oder wir können auch eine Funktion verwenden, siehe untenstehenden Code.

function check_cookie_name(name) 
    {
      var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
      if (match) {
        console.log(match[2]);
      }
      else{
           console.log('--something went wrong---');
      }
   }

Verbesserter Dank an Scott Jungwirth in den Kommentaren.

77voto

John S Punkte 20732

Die Methoden in einigen der anderen Antworten, die einen regulären Ausdruck verwenden, decken nicht alle Fälle ab, insbesondere:

  1. Wenn der Cookie der letzte Cookie ist. In diesem Fall wird nach dem Cookie-Wert kein Semikolon gesetzt.
  2. Wenn ein anderer Cookie-Name mit dem gesuchten Namen endet. Beispiel: Sie suchen nach dem Cookie mit dem Namen "one", und es gibt ein Cookie mit dem Namen "done".
  3. Wenn der Cookie-Name Zeichen enthält, die in einem regulären Ausdruck nur dann als solche interpretiert werden, wenn ihnen ein Backslash vorangestellt ist.

Die folgende Methode behandelt diese Fälle:

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

Dies ergibt null wenn der Cookie nicht gefunden wird. Es wird ein leerer String zurückgegeben, wenn der Wert des Cookies leer ist.

Anmerkungen:

  1. Diese Funktion setzt voraus Bei den Cookie-Namen wird zwischen Groß- und Kleinschreibung unterschieden. .
  2. document.cookie - Wenn dies auf der rechten Seite einer Zuweisung erscheint, stellt es eine Zeichenkette dar, die eine durch Semikolon getrennte Liste von Cookies enthält, die ihrerseits name=value Paare. Nach jedem Semikolon scheint ein einzelnes Leerzeichen zu stehen.
  3. String.prototype.match() - Rückgaben null wenn keine Übereinstimmung gefunden wird. Gibt ein Array zurück, wenn eine Übereinstimmung gefunden wurde, und das Element bei Index [1] ist der Wert der ersten passenden Gruppe.

Hinweise zu regulären Ausdrücken:

  1. (?:xxxx) - bildet eine nicht übereinstimmende Gruppe.
  2. ^ - stimmt mit dem Anfang der Zeichenkette überein.
  3. | - trennt alternative Muster für die Gruppe.
  4. ;\\s* - entspricht einem Semikolon gefolgt von null oder mehr Leerzeichen.
  5. = - entspricht einem Gleichheitszeichen.
  6. (xxxx) - bildet eine passende Gruppe.
  7. [^;]* - passt auf null oder mehr Zeichen außer einem Semikolon. Das bedeutet, dass er auf Zeichen bis zu einem Semikolon oder bis zum Ende der Zeichenkette passt, aber nicht darauf.

65voto

trante Punkte 32326

Wenn Sie jQuery verwenden, empfehle ich Ihnen, dieses Plugin zu verwenden:

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

Sie können den Keks also so lesen:

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

Sie können auch Cookie schreiben:

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

Cookie löschen:

$.removeCookie('obligations');

61voto

Martin Braun Punkte 7789

Hier ist ein Einzeiler, um einen Cookie-Wert mit einem bestimmten Namen zu erhalten, ohne dass eine externe Lib benötigt wird:

const value = ('; '+document.cookie).split(`; COOKIE_NAME=`).pop().split(';')[0];

Diese Antwort stützt sich auf Kirlichs geniale Lösung . Der einzige Kompromiss dieser Lösung ist, dass Sie eine leere Zeichenkette erhalten, wenn das Cookie nicht existiert. In den meisten Fällen sollte dies jedoch kein Hindernis darstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X