[javascript] 이름으로 쿠키 받기

쿠키에서 가치를 얻는 게 터가 있습니다.

이제 이름 shares=과 이름으로 2 개의 쿠키가 obligations=있습니다.

이 게터가 의무 쿠키에서 값을 가져 오도록 만들고 싶습니다.

어떻게해야합니까? 따라서 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]);
    }
 }



답변

배열을 반복하지 않는 한 가지 방법은 다음과 같습니다.

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

연습

토큰으로 문자열을 나누면 토큰이 문자열에없는 경우 하나의 문자열이있는 배열 (동일한 값) 또는 문자열이 토큰에있는 경우 두 개의 문자열이있는 배열이 생성됩니다.

첫 번째 (왼쪽) 요소는 토큰 이전의 문자열이고 두 번째 (오른쪽) 요소는 토큰 다음의 문자열입니다.

(참고 : 문자열이 토큰으로 시작하는 경우 첫 번째 요소는 빈 문자열입니다)

쿠키가 다음과 같이 저장되는 것을 고려하십시오.

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

특정 쿠키 값을 검색하려면 “; {name} =”다음 및 다음 “;”앞의 문자열을 가져와야합니다. 처리하기 전에 쿠키 문자열 앞에 “;”를 붙여 첫 번째 쿠키를 포함한 모든 쿠키 이름이 “;”및 “=”로 묶습니다.

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

이제 먼저 “; {name} =”으로 나눌 수 있으며, 쿠키 문자열에 토큰이 있으면 (즉, 두 개의 요소가있는 경우) 두 번째 요소는 쿠키 값으로 시작하는 문자열이됩니다. 그런 다음 배열 (예 : 팝)에서 꺼내고 동일한 프로세스를 반복하지만 이제 “;” 토큰으로, 그러나 이번에는 실제 토큰 값을 얻기 위해 왼쪽 문자열 (즉, 시프트)을 가져옵니다.


답변

쿠키에 단일 정규식 일치를 사용하는 것이 좋습니다.

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

또는 우리는 함수로 사용할 수 있습니다. 아래 코드를 확인하십시오.

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

댓글에서 Scott Jungwirth 덕분에 개선되었습니다.


답변

쿠키 얻기 스크립트를 사용하십시오.

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

quirksmode 쿠키 페이지에서 위의 코드를 훔쳤습니다. 당신은 그것을 읽어야합니다 .


답변

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

따라서 다음과 같이 쿠키를 읽을 수 있습니다.

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

또한 쿠키를 작성할 수 있습니다.

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

쿠키 삭제 :

$.removeCookie('obligations');


답변

정규 표현식을 사용하는 다른 답변 중 일부의 메소드는 특히 모든 경우를 다루지 않습니다.

  1. 쿠키가 마지막 쿠키 인 경우 이 경우 쿠키 값 뒤에 세미콜론이 없습니다.
  2. 다른 쿠키 이름이 조회중인 이름으로 끝나는 경우. 예를 들어, “one”이라는 쿠키를 찾고 있는데 “done”이라는 쿠키가 있습니다.
  3. 쿠키 이름 앞에 백 슬래시가없는 한 정규 표현식에서 사용될 때 자체로 해석되지 않는 문자가 쿠키 이름에 포함 된 경우

다음 방법은 이러한 경우를 처리합니다.

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쿠키를 찾지 못하면 합니다. 쿠키 값이 비어 있으면 빈 문자열을 반환합니다.

노트:

  1. 이 함수는 쿠키 이름이 대소 문자를 구분 한다고 가정 합니다 .
  2. document.cookie-할당의 오른쪽에 표시되면 세미콜론으로 구분 된 쿠키 목록이 포함 된 문자열을 나타냅니다 name=value. 각 세미콜론 다음에 단일 공백이있는 것으로 보입니다.
  3. String.prototype.match()null일치하는 것이 없으면 반환 합니다. 일치하는 항목이 발견되면 배열을 반환하고 index 요소 [1]는 첫 번째 일치 그룹의 값입니다.

정규식 참고 사항 :

  1. (?:xxxx) -일치하지 않는 그룹을 형성합니다.
  2. ^ -문자열의 시작과 일치합니다.
  3. | -그룹에 대한 대체 패턴을 분리합니다.
  4. ;\\s* -하나의 세미콜론 뒤에 0 개 이상의 공백 문자가옵니다.
  5. = -하나의 등호와 일치합니다.
  6. (xxxx) -일치하는 그룹을 형성합니다.
  7. [^;]*-세미콜론 이외의 0 개 이상의 문자와 일치합니다. 즉, 세미콜론 또는 문자열 끝까지는 포함하지만 문자는 포함하지 않습니다.

답변

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)

스캔하지 않고 모든 쿠키를 읽습니다. 적은 수의 쿠키도 괜찮습니다.


답변

Jonathan이 여기에서 제공 한 함수를 수정했습니다. 정규 표현식을 사용하면 다음과 같이 이름으로 쿠키 값을 얻을 수 있습니다.

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

빈 문자열을 반환하면 쿠키가 존재하지만 값이 없음을 의미하고, false를 반환하면 쿠키가 존재하지 않습니다. 이게 도움이 되길 바란다.