ฉันจะสร้างและอ่านค่าจากคุกกี้ได้อย่างไร


274

ฉันจะสร้างและอ่านค่าจากคุกกี้ใน JavaScript ได้อย่างไร



FWIW, js-cookieเป็น API ที่ดีมากสำหรับการจัดการ
Fagner Brack

คุณสามารถตรวจสอบคู่มือนี้ในJavaScript คุกกี้
Shubham Kumar

อย่าลืมว่าWeb Storage APIอาจเป็นทางเลือกที่ดีสำหรับคุกกี้ในบางสถานการณ์
MattBianco

คำตอบ:


234

นี่คือฟังก์ชั่นที่คุณสามารถใช้สำหรับการสร้างและดึงคุกกี้

function createCookie(name, value, days) {
    var expires;
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        expires = "; expires=" + date.toGMTString();
    }
    else {
        expires = "";
    }
    document.cookie = name + "=" + value + expires + "; path=/";
}

function getCookie(c_name) {
    if (document.cookie.length > 0) {
        c_start = document.cookie.indexOf(c_name + "=");
        if (c_start != -1) {
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) {
                c_end = document.cookie.length;
            }
            return unescape(document.cookie.substring(c_start, c_end));
        }
    }
    return "";
}

23
วิธีนี้ใช้ไม่ได้หากค่าคุกกี้ของคุณมีสิ่งใดที่ไม่สามารถเข้ารหัส / ถอดรหัสได้ดี หนึ่งในโรงเรียน w3schoolsดูเหมือนว่าจะทำงานได้อย่างสวยงาม
Richard Rout

13
wrapper ที่เรียบง่ายนี้จาก Mozillaมีการสนับสนุน unicode อย่างชัดเจนเช่นกัน
Brad Parks

4
@BradParks เลวร้ายเกินไปมันเผยแพร่ใน GPL
jahu

1
สิ่งนี้จะไม่ทำงานบน IE8 หรือ 9 หากคุกกี้ไม่มีค่าเพราะ IE จะไม่เพิ่มเครื่องหมายเท่ากับ ( = ) หลังชื่อคุกกี้ สิ่งที่เราทำคือการตรวจสอบว่าindexOf ("=") == - 1และถ้าเป็นเช่นนั้นให้ใช้คุกกี้ทั้งหมดเป็นชื่อคุกกี้
Mohoch

@jahu และฉันจะบอกว่ามันยังอยู่ในโดเมนสาธารณะ: developer.mozilla.org/en-US/docs/MDN/…
Chronial

51

วิธี ES6 ที่เรียบง่ายและสมบูรณ์แบบ:

const setCookie = (name, value, days = 7, path = '/') => {
  const expires = new Date(Date.now() + days * 864e5).toUTCString()
  document.cookie = name + '=' + encodeURIComponent(value) + '; expires=' + expires + '; path=' + path
}

const getCookie = (name) => {
  return document.cookie.split('; ').reduce((r, v) => {
    const parts = v.split('=')
    return parts[0] === name ? decodeURIComponent(parts[1]) : r
  }, '')
}

const deleteCookie = (name, path) => {
  setCookie(name, '', -1, path)
}

2
toGMTString()เลิกใช้แล้วใช้toUTCString()แทน
Thanh Nguyen

@ NguyenThanh ขอบคุณ! อัปเดต
artnikpro

1
บางครั้งค่าคุกกี้เองอาจมี=เครื่องหมาย ในกรณีนั้นฟังก์ชั่นgetCookieจะให้ผลลัพธ์ที่ไม่คาดคิด เพื่อหลีกเลี่ยงการพิจารณาให้ใช้ฟังก์ชั่นลูกศรต่อไปนี้ภายในลดconst [n, ...val] = v.split('='); return n === name ? decodeURIComponent(val.join('=')) : r
Dmitriy Zhura

ยินดีที่ได้มีตัวเลือกให้ออกจากวันหมดอายุแม้ว่า นี่จะทำให้คุกกี้ถูกลบโดยอัตโนมัติเมื่อออกจากเบราว์เซอร์
xji

4
864e5 = 86400000 = 1000*60*60*24แสดงจำนวนมิลลิวินาทีในวันที่ 24 ชั่วโมง
Henrikh Kantuni

41

คุกกี้ JQuery

หรือ Javascript ธรรมดา:

function setCookie(c_name,value,exdays)
{
   var exdate=new Date();
   exdate.setDate(exdate.getDate() + exdays);
   var c_value=escape(value) + ((exdays==null) ? "" : ("; expires="+exdate.toUTCString()));
   document.cookie=c_name + "=" + c_value;
}

function getCookie(c_name)
{
   var i,x,y,ARRcookies=document.cookie.split(";");
   for (i=0; i<ARRcookies.length; i++)
   {
      x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
      y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
      x=x.replace(/^\s+|\s+$/g,"");
      if (x==c_name)
      {
        return unescape(y);
      }
   }
}

1
ฉันทำเครื่องหมายสิ่งนี้เป็นหลักเพราะคุณพูดถึงคุกกี้ JQuery ฉันอยากจะแนะนำว่า รหัสมีขนาดเล็กมากและถ้าคุณใช้ JQuery อยู่แล้วมันเป็นเพียงสิ่งที่ถูกต้องที่จะใช้
w0rp

17

Mozilla ให้บริการกรอบการทำงานอย่างง่ายสำหรับการอ่านและการเขียนคุกกี้ด้วยการสนับสนุน unicode เต็มรูปแบบพร้อมกับตัวอย่างวิธีใช้

เมื่อรวมอยู่ในหน้าคุณสามารถตั้งค่าคุกกี้:

docCookies.setItem(name, value);

อ่านคุกกี้:

docCookies.getItem(name);

หรือลบคุกกี้:

docCookies.removeItem(name);

ตัวอย่างเช่น:

// sets a cookie called 'myCookie' with value 'Chocolate Chip'
docCookies.setItem('myCookie', 'Chocolate Chip');

// reads the value of a cookie called 'myCookie' and assigns to variable
var myCookie = docCookies.getItem('myCookie');

// removes the cookie called 'myCookie'
docCookies.removeItem('myCookie');

ดูตัวอย่างและรายละเอียดเพิ่มเติมได้ที่หน้า document.cookie ของ Mozilla

รุ่นของแฟ้มอย่างง่ายนี้ js เป็นบน GitHub


2
โปรดทราบว่าไลบรารีคุกกี้ที่ให้ไว้ใน MDN นั้นเผยแพร่ภายใต้ GPL ไม่ใช่ LGPL
คนงานทุกคนมีความจำเป็น

ไฟล์ javascript ใดที่ฉันต้องการนำเข้า ไม่พบ :(
AlikElzin-kilaka

ดูหัวข้อภายใต้ "Library" ในหน้านี้: developer.mozilla.org/en-US/docs/Web/API/document/… - คุณสามารถบันทึกลงในไฟล์และรวมหรือวางลงในไฟล์ js ที่มีอยู่ คุณต้องการใช้มัน
Brendan Nee

ดังนั้นไม่มีไฟล์จาวาสคริปต์แบบสแตนด์อโลน ดังนั้นจึงเป็นข้อมูลโค้ด - ไม่ใช่ห้องสมุดจริง
AlikElzin-kilaka

เยี่ยมมาก! "library" เป็นไฟล์. js ไฟล์เดียวที่มี ~ 80 บรรทัด เป็นไฟล์นี้ (บน GitHub): github.com/madmurphy/cookies.js/blob/master/cookies.js
ฟิลิปป์

8

ES7 ใช้ regex เพื่อรับ () ขึ้นอยู่กับMDN

const Cookie =
    { get: name => {
        let c = document.cookie.match(`(?:(?:^|.*; *)${name} *= *([^;]*).*$)|^.*$`)[1]
        if (c) return decodeURIComponent(c)
        }
    , set: (name, value, opts = {}) => { 
        if (opts.days) { 
            opts['max-age'] = opts.days * 60 * 60 * 24; 
            delete opts.days 
            }
        opts = Object.entries(opts).reduce((str, [k, v]) => `${str}; ${k}=${v}`, '')
        document.cookie = name + '=' + encodeURIComponent(value) + opts
        }
    , delete: (name, opts) => Cookie.set(name, '', {'max-age': -1, ...opts}) 
    // path & domain must match cookie being deleted 
    }

Cookie.set('user', 'Jim', {path: '/', days: 10}) 
// Set the path to top level (instead of page) and expiration to 10 days (instead of session)

การใช้งาน - Cookie.get (ชื่อค่า [ตัวเลือก]):
ตัวเลือกรองรับตัวเลือกคุกกี้มาตรฐานทั้งหมดและเพิ่ม "วัน":

  • เส้นทาง : '/' - เส้นทางสัมบูรณ์ใด ๆ เริ่มต้น : ตำแหน่งเอกสารปัจจุบัน
  • โดเมน : 'sub.example.com' - อาจไม่ขึ้นต้นด้วยจุด เริ่มต้น : โฮสต์ปัจจุบันที่ไม่มีโดเมนย่อย
  • ปลอดภัย : จริง - ให้บริการเฉพาะคุกกี้ผ่าน https เริ่มต้น : เท็จ
  • วัน : 2 - วันจนกระทั่งคุกกี้หมดอายุ เริ่มต้น : สิ้นสุดเซสชัน
    ทางเลือกอื่นของการตั้งค่าการหมดอายุ:
    • หมดอายุ : 'Sun, 18 Feb 2018 16:23:42 GMT' - วันที่หมดอายุเป็นสตริง GMT
      วันที่ปัจจุบันสามารถรับได้ด้วย: วันที่ใหม่ (Date.now ()) toUTCString ()
    • 'max-age' : 30 - เหมือนวัน แต่ในไม่กี่วินาทีแทนที่จะเป็นวัน

คำตอบอื่น ๆ ใช้ "หมดอายุ" แทน "max-age" เพื่อรองรับ IE เวอร์ชันที่เก่ากว่า วิธีนี้ต้องใช้ ES7 ดังนั้น IE7 จึงไม่เป็นเช่นนั้น (นี่ไม่ใช่เรื่องใหญ่)

หมายเหตุ: สนับสนุนอักขระตลกเช่น "=" และ "{:}" เป็นค่าคุกกี้และ regex จัดการกับช่องว่างนำหน้าและต่อท้าย (จาก libs อื่น ๆ )
หากคุณต้องการเก็บวัตถุให้เข้ารหัสก่อนและหลังด้วยและ JSON.stringify และ JSON.parse แก้ไขข้างต้นหรือเพิ่มวิธีอื่น เช่น:

Cookie.getJSON = name => JSON.parse(Cookie.get(name))
Cookie.setJSON = (name, value, opts) => Cookie.set(name, JSON.stringify(value), opts);

Downvoters จะอธิบายว่าเกิดอะไรขึ้นกับวิธีการของฉันได้ไหม
SamGoody

1
1. สั้นกว่าและ IMO ง่ายต่อการบำรุงรักษา 2. สมบูรณ์มากขึ้น (เป็นคำตอบเดียวที่จะยอมรับความปลอดภัยลำดับของการโต้แย้งอายุสูงสุด) 3. ค่าเริ่มต้นมาตรฐานเพิ่มเติม (เส้นทาง ฯลฯ ค่าเริ่มต้นมาตรฐานซึ่งแตกต่างจากคำตอบส่วนใหญ่ที่นี่) 4. แนวปฏิบัติที่ดีที่สุด (ตาม MDN regex เป็นวิธีที่เชื่อถือได้มากที่สุดในการแยกค่า) 5. Futureprook (หากมีการเพิ่มตัวเลือกเพิ่มเติมลงในคุกกี้พวกเขาจะได้รับการดูแล) 6. วัตถุหนึ่งสร้างรหัสน้อยกว่าฟังก์ชั่นจำนวนมาก 7. รับตั้งค่าและลบและเพิ่มวิธีการเพิ่มเติมได้ง่าย 8. ES7 (buzzwords แสนอร่อย)
SamGoody

7

สำหรับผู้ที่ต้องการบันทึกวัตถุเช่น {foo: 'bar'} ฉันจะแบ่งปันคำตอบของ @ KevinBurke รุ่นแก้ไขของฉัน ฉันได้เพิ่ม JSON.stringify และ JSON.parse นั่นคือทั้งหมด

cookie = {

    set: function (name, value, days) {
        if (days) {
            var date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            var expires = "; expires=" + date.toGMTString();
        }
        else
            var expires = "";
        document.cookie = name + "=" + JSON.stringify(value) + expires + "; path=/";
    },

    get : function(name){
        var nameEQ = name + "=",
            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  JSON.parse(c.substring(nameEQ.length,c.length));
        }

        return null;
    }

}

ดังนั้นตอนนี้คุณสามารถทำสิ่งนี้:

cookie.set('cookie_key', {foo: 'bar'}, 30);

cookie.get('cookie_key'); // {foo: 'bar'}

cookie.set('cookie_key', 'baz', 30);

cookie.get('cookie_key'); // 'baz'

5

ฉันเคยตอบรับกระทู้นี้หลายครั้งแล้ว มันเป็นโค้ดที่ยอดเยี่ยม: เรียบง่ายและใช้งานได้ แต่ฉันมักจะใช้babelและ ES6 และโมดูลดังนั้นหากคุณเป็นเหมือนฉันนี่คือรหัสที่จะคัดลอกเพื่อการพัฒนาที่รวดเร็วขึ้นด้วย ES6

คำตอบที่ยอมรับถูกเขียนใหม่เป็นโมดูลด้วย ES6:

export const createCookie = ({name, value, days}) => {
  let expires;
  if (days) {
    let date = new Date();
    date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
    expires = '; expires=' + date.toGMTString();
  } else {
    expires = '';
  }
  document.cookie = name + '=' + value + expires + '; path=/';
};

export const getCookie = ({name}) => {
  if (document.cookie.length > 0) {
    let c_start = document.cookie.indexOf(name + '=');
    if (c_start !== -1) {
      c_start = c_start + name.length + 1;
      let c_end = document.cookie.indexOf(';', c_start);
      if (c_end === -1) {
        c_end = document.cookie.length;
      }
      return unescape(document.cookie.substring(c_start, c_end));
    }
  }
  return '';
};

และหลังจากนี้คุณสามารถนำเข้ามันเป็นโมดูลใด ๆ (เส้นทางของหลักสูตรอาจแตกต่างกัน):

import {createCookie, getCookie} from './../helpers/Cookie';

5

นี่คือรหัสที่จะได้รับชุดและลบคุกกี้ใน JavaScript

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

function setCookie(name, value, expirydays) {
 var d = new Date();
 d.setTime(d.getTime() + (expirydays*24*60*60*1000));
 var expires = "expires="+ d.toUTCString();
 document.cookie = name + "=" + value + "; " + expires;
}

function deleteCookie(name){
  setCookie(name,"",-1);
}

ที่มา: http://mycodingtricks.com/snippets/javascript/javascript-cookies/


2

ฉันใช้วัตถุนี้ ค่าถูกเข้ารหัสดังนั้นจึงจำเป็นต้องพิจารณาเมื่ออ่านหรือเขียนจากฝั่งเซิร์ฟเวอร์

cookie = (function() {

/**
 * Sets a cookie value. seconds parameter is optional
 */
var set = function(name, value, seconds) {
    var expires = seconds ? '; expires=' + new Date(new Date().getTime() + seconds * 1000).toGMTString() : '';
    document.cookie = name + '=' + encodeURIComponent(value) + expires + '; path=/';
};

var map = function() {
    var map = {};
    var kvs = document.cookie.split('; ');
    for (var i = 0; i < kvs.length; i++) {
        var kv = kvs[i].split('=');
        map[kv[0]] = decodeURIComponent(kv[1]);
    }
    return map;
};

var get = function(name) {
    return map()[name];
};

var remove = function(name) {
    set(name, '', -1);
};

return {
    set: set,
    get: get,
    remove: remove,
    map: map
};

})();

0

วิธีง่ายๆในการอ่านคุกกี้ใน ES6

function getCookies() {
    var cookies = {};
    for (let cookie of document.cookie.split('; ')) {
        let [name, value] = cookie.split("=");
        cookies[name] = decodeURIComponent(value);
    }
    console.dir(cookies);
}


0

คุณสามารถใช้โมดูล ES คุกกี้ของฉันเพื่อรับ / ตั้ง / ลบคุกกี้

การใช้งาน:

ในแท็กส่วนหัวของคุณให้ใส่รหัสต่อไปนี้:

<script src="https://raw.githack.com/anhr/cookieNodeJS/master/build/cookie.js"></script>

หรือ

<script src="https://raw.githack.com/anhr/cookieNodeJS/master/build/cookie.min.js"></script>

ตอนนี้คุณสามารถใช้ window.cookie สำหรับเก็บข้อมูลผู้ใช้ในหน้าเว็บ

cookie.isEnabled ()

คุกกี้ถูกเปิดใช้งานในเว็บเบราว์เซอร์ของคุณหรือไม่

returns {boolean} true if cookie enabled.

ตัวอย่าง

if ( cookie.isEnabled() )
    console.log('cookie is enabled on your browser');
else
    console.error('cookie is disabled on your browser');

cookie.set (ชื่อค่า)

ตั้งค่าคุกกี้

name: cookie name.
value: cookie value.

ตัวอย่าง

cookie.set('age', 25);

cookie.get (ชื่อ [, defaultValue]);

รับคุกกี้

name: cookie name.
defaultValue: cookie default value. Default is undefined.
returns cookie value or defaultValue if cookie was not found
ตัวอย่าง
var age = cookie.get('age', 25);

cookie.remove (ชื่อ);

ลบคุกกี้

name: cookie name.
ตัวอย่าง
cookie.remove( 'age' );

ตัวอย่างการใช้งาน


-1

readCookie รุ่นปรับปรุงใหม่:

function readCookie( name )
{
    var cookieParts = document.cookie.split( ';' )
    ,   i           = 0
    ,   part
    ,   part_data
    ,   value
    ;

    while( part = cookieParts[ i++ ] )
    {
        part_data = part.split( '=' );

        if ( part_data.shift().replace(/\s/, '' ) === name )
        {
            value = part_data.shift();
            break;
        }

    }
    return value;
}

สิ่งนี้จะแตกทันทีที่คุณพบมูลค่าคุกกี้ของคุณและคืนค่าของมัน ในความคิดของฉันหรูหรามากด้วยการแยกคู่

การแทนที่ if-condition เป็นการตัดแต่งพื้นที่สีขาวเพื่อให้แน่ใจว่าตรงกับอย่างถูกต้อง


-1
function setCookie(cname,cvalue,exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires=" + d.toGMTString();
    document.cookie = cname+"="+cvalue+"; "+expires;
}

function getCookie(cname) {
    var name = cname + "=";
    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);
        if (c.indexOf(name) == 0) {
            return c.substring(name.length, c.length);
        }
    }
    return "";
}

function checkCookie() {
    var user=getCookie("username");
    if (user != "") {
        alert("Welcome again " + user);
    } else {
       user = prompt("Please enter your name:","");
       if (user != "" && user != null) {
           setCookie("username", user, 30);
       }
    }
}

-1

ฉันเขียน cookieUtils ง่าย ๆ มันมีสามหน้าที่สำหรับการสร้างคุกกี้อ่านคุกกี้และลบคุกกี้

var CookieUtils = {
    createCookie: function (name, value, expireTime) {
        expireTime = !!expireTime ? expireTime : (15 * 60 * 1000); // Default 15 min
        var date = new Date();
        date.setTime(date.getTime() + expireTime);
        var expires = "; expires=" + date.toGMTString();
        document.cookie = name + "=" + value + expires + "; path=/";
    },
    getCookie: function (name) {
        var value = "; " + document.cookie;
        var parts = value.split("; " + name + "=");
        if (parts.length == 2) {
            return parts.pop().split(";").shift();
        }
    },
    deleteCookie: function(name) {
        document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
    }
};

-1

นี่คือตัวอย่างจากw3choolsที่ถูกกล่าวถึง

function setCookie(cname, cvalue, exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires="+ d.toUTCString();
    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}

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

-1

อ่านง่าย

var getCookie = function (name) {
    var valueStart = document.cookie.indexOf(name + "=") + name.length + 1;
    var valueEnd = document.cookie.indexOf(";", valueStart); 
    return document.cookie.slice(valueStart, valueEnd)
}

-2

วิธีอ่านคุกกี้ที่หน้าด้านและเรียบง่ายอาจเป็นดังนี้:

let username, id; 
eval(document.cookie); 
console.log(username + ", " + id); // John Doe, 123

username="John Doe"; id=123;นี้สามารถนำมาใช้ถ้าคุณรู้ว่าคุกกี้ของคุณมีสิ่งที่ชอบ: โปรดทราบว่าสตริงจะต้องมีเครื่องหมายคำพูดในคุกกี้ อาจไม่ใช่วิธีที่แนะนำ แต่ใช้สำหรับการทดสอบ / การเรียนรู้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.