Nhận cookie theo tên


362

Tôi có một getter để lấy giá trị từ một cookie.

Bây giờ tôi có 2 cookie theo tên shares=và theo tên obligations=.

Tôi muốn làm cho getter này chỉ để có được các giá trị từ cookie nghĩa vụ.

Làm thế nào để tôi làm điều này? Vì vậy, forphân chia dữ liệu thành các giá trị riêng biệt và đặt nó trong một mảng.

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

Có một số nhựa của bạn không chỉ làm cho nó một mảng?
webLacky3rdClass

Làm cho cookie một mảng tôi nên nói.
webLacky3rdClass

Không, làm thế nào tôi có thể làm điều đó?


Bạn có thể muốn chấp nhận một câu trả lời: câu hỏi của bạn vẫn được gắn thẻ là chưa được trả lời.
Soleil - Mathieu Prévot

Câu trả lời:


499

Một cách tiếp cận, tránh lặp lại trên một mảng, sẽ là:

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

Hướng dẫn

Việc tách một chuỗi bằng mã thông báo sẽ tạo ra một mảng, với một chuỗi (cùng giá trị), trong trường hợp mã thông báo không tồn tại trong một chuỗi hoặc một mảng có hai chuỗi, trong trường hợp mã thông báo được tìm thấy trong một chuỗi.

Phần tử đầu tiên (bên trái) là chuỗi của phần trước mã thông báo và phần thứ hai (bên phải) là phần của phần trước phần sau của mã thông báo.

(LƯU Ý: trong trường hợp chuỗi bắt đầu bằng mã thông báo, phần tử đầu tiên là chuỗi trống)

Xem xét rằng cookie được lưu trữ như sau:

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

để truy xuất giá trị cookie cụ thể, chúng ta chỉ cần lấy chuỗi nằm sau "; {name} =" và trước tiếp theo ";". Trước khi thực hiện bất kỳ quá trình xử lý nào, chúng tôi thêm vào chuỗi cookie bằng ";", sao cho mọi tên cookie, kể cả tên đầu tiên, được đính kèm với ";" và "=":

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

Bây giờ, trước tiên chúng ta có thể phân tách bằng "; {name} =" và nếu mã thông báo được tìm thấy trong chuỗi cookie (nghĩa là chúng ta có hai phần tử), chúng ta sẽ kết thúc với phần tử thứ hai là một chuỗi bắt đầu bằng giá trị cookie của chúng ta. Sau đó, chúng tôi lấy nó ra từ một mảng (tức là pop) và lặp lại quá trình tương tự, nhưng bây giờ với ";" dưới dạng mã thông báo, nhưng lần này kéo ra chuỗi bên trái (tức là dịch chuyển) để lấy giá trị mã thông báo thực tế.


13
@ user3132564 đã cố chỉnh sửa nó trong nhưng thực sự là một nhận xét: Phương thức này trả về giá trị sai khi bạn tìm kiếm hậu tố của cookie - nếu giá trị của document.cookie là "FirstName = John" và bạn gọi getCookie ("Tên "), bạn sẽ lấy lại" John "mặc dù không có cookie theo tên đó. Nó cũng không hoạt động nếu tên của một cookie là hậu tố của một tên khác - nếu document.cookie là "Name = John; LastName = Doe", gọi split ("Name =") trả về một mảng có ba chuỗi và phương thức không ' t trả về đúng giá trị cho getCookie ("Tên").
Dennis Jaheruddin

20
Cảnh báo về việc thực hiện trong câu trả lời này: nếu có nhiều hơn một cookie cùng tên thì sẽ không có giá trị cookie nào được trả về. Ví dụ: nếu có một cookie có tên stackToken được đặt cho các tên miền .stackexchange.com cũng như lập trình viên.stackexchange.com thì nếu bạn gọi getCookie ("stackToken") thì giá trị sẽ không được trả về - phần.length sẽ lớn hơn 2. Nếu bạn biết tất cả các giá trị cookie cho cùng một tên (nhưng tên miền và đường dẫn khác nhau) sẽ giống nhau, hãy xem câu trả lời được chấp nhận tại đây: stackoverflow.com/questions/5639346/
Lỗi

7
@DennisJaheruddin - Có vẻ như vấn đề hậu tố đã được khắc phục.
Nathan JB

2
@ NathanJ.Brauer bạn đúng. Đã cập nhật để giải quyết vấn đề đó từ lâu, nhưng chỉ ghi chú trong changelog, thay vì trong các bình luận.
kirlich

có một lỗi của nó Nếu cookie "tên" và được gạch chân trong một tên giống như khác, IE 10+cũng gây ra lỗi. Ví dụ: "user": "Joe", "user_name":"Doe"
Boz

176

Tôi muốn sử dụng một kết hợp biểu thức chính quy duy nhất trên cookie:

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

HOẶC Ngoài ra chúng tôi có thể sử dụng như một chức năng, kiểm tra mã bên dưới.

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

Cải thiện nhờ Scott Jungwirth trong các ý kiến.


11
Điều này có thể có kết quả khớp sai nếu hai cookie có cùng hậu tố. Nó sẽ phù hợp với cả xyz=valueabcxyz=valuekhi nào name = xyz.
Brent Washburne

3
unescape((document.cookie.match(key + '=([^;].+?)(;|$)') || [])[1] || '');Phiên bản sửa đổi của Glize / dom / Cookies
Valentin Podkamennyi

19
cập nhật Regex để new RegExp('(^| )' + name + '=([^;]+)')tránh sự cố được nêu ra bởi @BrentWashburne. Ngoài ra tôi đã thực hiện một bài kiểm tra jsperf cho câu hỏi này và câu trả lời có số phiếu cao nhất, bài kiểm tra này xuất hiện một chút trên đầu, nhưng chắc chắn là ít mã hơn và dễ theo dõi hơn: jsperf.com/simple-get-cookie-by-name
Scott Jungwirth

5
@ScottJungwirth Có, nhưng sau đó bạn phải cập nhật câu lệnh return để trả về kết quả khớp [2];
Joe

@ScottJungwirth Tại sao không new RegExp('(^|;)' + name + '=([^;]+)')? Phía namesau bắt đầu của một dòng hoặc dấu chấm phẩy, tại sao một khoảng trắng ``?
Junlin

89

sử dụng tập lệnh nhận cookie:

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

sau đó gọi nó:

var value = readCookie('obligations');

tôi đã đánh cắp mã ở trên từ trang cookie quirksmode. bạn nên đọc nó .


7
... đã đánh cắp mã từ W3schools. Ồ w3schools.com/js/js_cookies.asp
WillWam

Này, ít nhất tôi đã cho tín dụng: p cũng làm sao bạn biết rằng đó là bản gốc?
mkoryak

Nói chung là an toàn khi giả định W3S đặt nó ở đó trước. Họ là nhà của rất nhiều người mới sử dụng mã ctrl-c.
WillWam

Trên thực tế có vẻ như nó là cách khác :) Quirksmode là / là một trang web tuyệt vời cho các yêu cầu trình duyệt và cũng có một nguồn ở đó. scottandrew.com
sunn0

tôi yêu trường w3s. có lẽ là nền tảng tốt nhất cho người cao niên
Ralph Dingus

56

Nếu bạn sử dụng jQuery, tôi khuyên bạn nên sử dụng plugin này:

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

Vì vậy, bạn có thể đọc cookie như thế này:

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

Ngoài ra, bạn có thể viết cookie:

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

Xóa cookie:

$.removeCookie('obligations');

1
Không chắc chắn tại sao điều này đã không được bình chọn là câu trả lời tốt nhất thực sự. Có jQuery của nó và không phải javascript nhưng đồng thời IT IS !!!!
Cozzbie

21
@Cozzbie có thể bao gồm một thư viện bên ngoài (do đó thêm một yêu cầu http khác) để chỉ lấy một giá trị cookie là một loại quá mức không cần thiết.
rahulserver

Tôi đang gặp lỗi "Uncaught ReferenceError: $ không được xác định" tại "$ .cookie". Mặc dù tôi đã bao gồm tất cả các thư viện cần thiết như jquery.min.js và thư viện được đề xuất trong câu trả lời này.
Adarsh ​​Singh

44

Các phương thức trong một số câu trả lời khác sử dụng biểu thức chính quy không bao gồm tất cả các trường hợp, đặc biệt:

  1. Khi cookie là cookie cuối cùng. Trong trường hợp này, sẽ không có dấu chấm phẩy sau giá trị cookie.
  2. Khi một tên cookie khác kết thúc với tên được tìm kiếm. Ví dụ: bạn đang tìm kiếm cookie có tên "một" và có một cookie có tên "xong".
  3. Khi tên cookie bao gồm các ký tự không được hiểu là chính chúng khi được sử dụng trong một biểu thức thông thường trừ khi chúng được đặt trước dấu gạch chéo ngược.

Phương pháp sau đây xử lý các trường hợp sau:

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

Điều này sẽ trở lại nullnếu không tìm thấy cookie. Nó sẽ trả về một chuỗi rỗng nếu giá trị của cookie trống.

Ghi chú:

  1. Hàm này giả sử tên cookie là trường hợp nhạy cảm .
  2. document.cookie- Khi phần này xuất hiện ở phía bên phải của bài tập, nó đại diện cho một chuỗi chứa danh sách cookie được phân tách bằng dấu chấm phẩy, lần lượt là name=valuecác cặp. Dường như có một khoảng trống sau mỗi dấu chấm phẩy.
  3. String.prototype.match()- Trả về nullkhi không tìm thấy kết quả khớp. Trả về một mảng khi tìm thấy kết quả khớp và phần tử tại chỉ mục [1]là giá trị của nhóm khớp đầu tiên.

Ghi chú biểu thức chính quy:

  1. (?:xxxx) - tạo thành một nhóm không phù hợp.
  2. ^ - khớp với phần bắt đầu của chuỗi.
  3. | - tách các mẫu thay thế cho nhóm.
  4. ;\\s* - khớp với một dấu chấm phẩy theo sau là 0 hoặc nhiều ký tự khoảng trắng.
  5. = - khớp với một dấu bằng.
  6. (xxxx) - tạo thành một nhóm phù hợp.
  7. [^;]*- khớp với 0 hoặc nhiều ký tự khác với dấu chấm phẩy. Điều này có nghĩa là nó sẽ khớp các ký tự lên đến, nhưng không bao gồm dấu chấm phẩy hoặc đến cuối chuỗi.

4
Câu trả lời này là chức năng tốt nhất và ngắn nhất hoạt động trong mọi trường hợp mà không khớp sai. Nó cũng có lời giải thích tốt nhất về cách thức hoạt động. Tuy nhiên, chức năng thoát không được giải thích và tôi sẽ nghĩ rằng nếu tác giả tạo cookie, anh ta sẽ biết liệu tên đó có cần phải thoát hay không. Vì vậy, tôi muốn thấy một chức năng ngắn hơn:function getCookie(name) { var match = document.cookie.match(RegExp('(?:^|;\\s*)' + name + '=([^;]*)')); return match ? match[1] : null; }
Jeff Baker

Nếu nó là một công cụ chung, nó sẽ thoát tên hoặc đưa ra lỗi nếu tên không thể được nhúng trực tiếp vào regex. Những người biết các ràng buộc của ứng dụng của họ có thể loại bỏ lối thoát hoặc người bảo vệ.
Joe Lapp

31

4 năm sau, ES6 phiên bản đơn giản hơn.

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

Tôi cũng đã tạo ra một ý chính để sử dụng nó như một Cookieđối tượng. ví dụ, Cookie.set(name,value)Cookie.get(name)

Điều này đọc tất cả các cookie thay vì quét qua. Nó ổn với số lượng nhỏ cookie.


23

Tôi đã sửa đổi hàm mà Jonathan cung cấp ở đây, bằng cách sử dụng biểu thức chính quy, bạn có thể nhận được giá trị cookie theo tên của nó như sau:

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
}

Nếu nó trả về chuỗi rỗng, điều đó có nghĩa là cookie tồn tại nhưng không có giá trị, nếu nó trả về false thì cookie không tồn tại. Tôi hi vọng cái này giúp được.


Chỉ tò mò, tại sao bạn không sử dụng vartrên dòng 3? matched = ...
Victorio Berra

Xin lỗi về điều đó, quên viết nó.
Mohyaddin Alaoddin

14

Đây là một lớp lót để có được một cookie với một tên cụ thể mà không cần bất kỳ lib bên ngoài nào:

var cookie = ("; "+document.cookie).split("; YOUR_COOKIE_NAME=").pop().split(";").shift();

Câu trả lời này dựa trên giải pháp tuyệt vời của kirlich . Sự thỏa hiệp duy nhất của giải pháp này là, bạn sẽ nhận được một chuỗi rỗng khi cookie không tồn tại. Trong hầu hết các trường hợp, đây không phải là một công cụ thỏa thuận.


10

Tôi biết đó là một câu hỏi cũ nhưng tôi cũng gặp phải vấn đề này. Chỉ để ghi lại, có một API nhỏ trong trang web mozilla của nhà phát triển .

Yoy có thể nhận bất kỳ cookie nào bằng tên chỉ bằng cách sử dụng JS. Mã này cũng sạch hơn IMHO (ngoại trừ dòng dài, tôi chắc chắn rằng bạn có thể dễ dàng sửa chữa).

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

Như đã nêu trong các ý kiến, hãy lưu ý rằng phương thức này giả định rằng khóa và giá trị được mã hóa bằng encodeURIComponent (). Xóa giải mã & encodeURIComponent () nếu khóa và giá trị của cookie không được mã hóa.


1
Chỉ cần lưu ý rằng phương thức giả định tên và giá trị cookie được mã hóa bằng cách sử dụng encodeURIComponent()khi cookie được đặt, điều này sẽ đúng nếu bạn sử dụng chức năng đồng hành để đặt cookie, nhưng có thể không phải luôn luôn như vậy. kiểm tra
John S

@ John Chúng ta chỉ có thể loại bỏ decodeURIComponent, phải không? (Nếu chúng tôi không sử dụng nó để đặt cookie?) Nó vẫn hoạt động chứ?
NiCk Newman

Đúng, chỉ cần loại bỏ decodeURI và regrec này là một con quái vật. Cảm ơn Marc, đã bình chọn!
Nick Newman

10

Bạn có thể sử dụng thư viện js-cookie để nhận và đặt cookie JavaScript.

Bao gồm HTML của bạn:

<script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>

Để tạo Cookie:

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

Để đọc Cookie:

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

8

Đây là một phiên bản khá ngắn

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

Lưu ý rằng tôi đã sử dụng các chuỗi mẫu của ES6 để soạn biểu thức regex.


2
Câu trả lời tốt nhất từ ​​bây giờ. Sử dụng các tính năng ES6. Đó là năm 2017 và mọi người vẫn đang sử dụng var, +để ghép nối, v.v. -.- '
Elias Soares

@EliasSoares Vấn đề của việc sử dụng là vargì?
mrReiha


Không phải là một vấn đề, nhưng sử dụng let là một cách thực hành tốt vì nó có lợi thế trong nhiều tình huống và hầu như không có nhược điểm nào
Elias Soares

7

Sử dụng object.defineProperty

Với điều này, bạn có thể dễ dàng truy cập 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
        }, {});
    }
});

Từ bây giờ bạn chỉ có thể làm:

alert( Cookies.obligations );

Điều này cũng sẽ tự động cập nhật, vì vậy nếu bạn thay đổi cookie, Cookiesnó cũng sẽ thay đổi.


2
Hoàn hảo! ngoại trừ việc nó sẽ không hoạt động đối với các đối tượng có một số ký tự như dấu gạch ngang (như tên cookie) và khi chia tách, các đối tượng có một khoảng trống trên đầu tiên vì vậy tôi đi cookies[(cookie.split("=")[0]).replace(/ /g,'')] = ... Cảm ơn!!
Samuel Elh

@Samuel Elh đúng, nhưng bạn cũng có thể sử dụng .trim () thay vì thay thế (/ / g, '')
mtizziani

7

kirlich đã đưa ra một giải pháp tốt. Tuy nhiên, nó không thành công khi có hai giá trị cookie có tên giống nhau, đây là cách khắc phục đơn giản cho tình huống này:

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

6

luôn hoạt động tốt:

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

Không có yêu cầu cho jQuery hoặc bất cứ điều gì. JavaScript cũ tốt thuần túy.


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

6

Chức năng đơn giản để Nhận cookie với tên 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] : "";
}

6

Rõ ràng MDN chưa bao giờ nghe nói về lớp ký tự regex ranh giới từ \b, khớp với tiếp giáp \w+được giới hạn ở hai bên với \W+:

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

var obligations = getCookie('obligations');

5

Dường như với tôi, bạn có thể chia các cặp khóa-giá trị cookie thành một mảng và dựa trên tìm kiếm của bạn:

var obligations = getCookieData("obligations");

Mà chạy như sau:

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

Câu đố: http://jsfiddle.net/qFmPc/

Hoặc thậm chí có thể sau đây:

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

1
Có phương pháp nào để sử dụng document.cookie.indexOf (name) và để so sánh không?

@AndrejHefner Bạn có thể, mặc dù điều đó sẽ phù hợp với các chuỗi con. Vì vậy, nếu bạn có tên cookie là "foobar" và một tên có tên là "thanh", bạn có thể bị nhầm lẫn giữa "thanh" trong "foobar" với "thanh" phím.
Sampson

@AndrejHefner Vui lòng xem phương thức sau, sẽ nhanh hơn vì nó kiểm tra chuỗi cho khớp.
Sampson

1
Phương thức thứ hai có một lỗi trong đó nó sẽ không tìm thấy giá trị cookie cuối cùng vì nó luôn tìm kiếm một; cuối cùng. Một phiên bản chỉnh sửa sẽ là:function getCookieData( name ) { var patrn = new RegExp( "(?:^| )" + name + "=(.*?)(?:;|$)" ); if ( match = (document.cookie.match(patrn) )) return match[1]; return false; }
Oz Solomon

5

Trong các dự án của tôi, tôi sử dụng chức năng sau để truy cập cookie theo tên

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

4

Nếu bạn chỉ cần kiểm tra nếu một số cookie tồn tại thì đơn giản làm điều này:

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

nếu cookie đăng nhập = true tồn tại, bạn sẽ nhận được 2, nếu không phải 1.

log = true - thay đổi tên này thành tên cookie = value hoặc chỉ một tên


1
.indexOf() >= 0Thay vào đó, nó sẽ dễ đọc hơn ?
Vic Seedoubleyew

3

Đã có câu trả lời hay ở đây để nhận cookie, tuy nhiên đây là giải pháp của riêng tôi:

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

cách sử dụng: `

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

3

được đặt bởi javascript

document.cookie = 'cookiename=tesing';

nhận được bằng jquery với plugin jquery-cookie

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

alert(value);

@cytsunny - điều này là do bạn phải có plugin cookie jquery để sử dụng cái này.
Alex Standiford

Wow .... thật là một thông tin quan trọng bị thiếu trước đây .... Nhưng từ liên kết bạn cung cấp, có vẻ như chủ sở hữu của thư viện đã quyết định rằng họ nên loại bỏ sự phụ thuộc của jquery.
cytsunny


2

Giải pháp của tôi là thế này:

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

Hàm này sử dụng hàm Underscorejs _.find. Trả về không xác định nếu tên cookie không tồn tại


2

Tôi đã làm theo cách này. để tôi có một đối tượng truy cập để phân tách các giá trị. Với điều này, bạn có thể chuyển cookie cho cha mẹ và sau đó bạn có thể truy cập các giá trị của mình bằng các khóa như

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

1

Một cách tiếp cận chức năng để tìm cookie hiện có. Nó trả về một mảng, vì vậy nó hỗ trợ nhiều lần xuất hiện cùng tên. Nó không hỗ trợ khớp khóa một phần, nhưng việc thay thế === trong bộ lọc bằng regex là chuyện nhỏ.

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

1

Chỉ cần sử dụng chức năng sau (mã javascript thuần túy)

const getCookie = (name) => {
 const cookies = Object.assign({}, ...document.cookie.split('; ').map(cookie => {
    const name = cookie.split('=')[0];
    const value = cookie.split('=')[1];

    return {[name]: value};
  }));

  return cookies[name];
};

1

Nhận cookie theo tên chỉ cần chuyển tên của cookie vào bên dưới chức năng

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

0

Hàm sau sẽ trả về một key-valuecặp cookie cần thiết, keytên cookie là gì và valuesẽ là giá trị của 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;
};

0

Ví dụ về cookie: ví dụ 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;
   }
}

Lưu trữ mảng và đối tượng với json hoặc xml

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.