รับคุกกี้ตามชื่อ


362

ฉันมีผู้ทะเยอทะยานเพื่อรับค่าจากคุกกี้

ตอนนี้ผมมี 2 คุกกี้โดยชื่อและชื่อshares=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]);
    }
 }

มีเรซิ่นบางส่วนที่คุณไม่เพียง แต่ทำให้เป็นอาร์เรย์หรือไม่?
webLacky3rdClass

ทำให้คุกกี้เป็นอาร์เรย์ที่ฉันควรพูด
webLacky3rdClass

ไม่ฉันจะทำอย่างนั้นได้อย่างไร


คุณอาจต้องการยอมรับคำตอบ: คำถามของคุณยังถูกแท็กว่ายังไม่ได้รับคำตอบ
Soleil - Mathieu Prévot

คำตอบ:


499

วิธีการหนึ่งที่หลีกเลี่ยงการวนซ้ำจะเป็น:

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} =" และหากพบโทเค็นในสตริงคุกกี้ (เช่นเรามีสององค์ประกอบ) เราจะจบลงด้วยองค์ประกอบที่สองเป็นสตริงที่เริ่มต้นด้วยค่าคุกกี้ของเรา จากนั้นเราก็ดึงมันออกมาจากอาเรย์ (เช่นป๊อป) และทำซ้ำกระบวนการเดียวกัน แต่ตอนนี้ด้วย ";" เป็นโทเค็น แต่คราวนี้ดึงสตริงซ้าย (เช่น shift) เพื่อรับค่าโทเค็นจริง


13
@ user3132564 พยายามแก้ไขสิ่งนี้ แต่จริงๆแล้วมันเป็นความคิดเห็น: วิธีนี้จะส่งกลับค่าที่ไม่ถูกต้องเมื่อคุณค้นหาคำต่อท้ายของคุกกี้ - ถ้าค่าของ document.cookie คือ "FirstName = John" และคุณเรียก getCookie ("ชื่อ ") คุณจะได้รับ" John "กลับแม้ว่าจะไม่มีชื่อคุกกี้ก็ตาม นอกจากนี้ยังใช้งานไม่ได้หากชื่อคุกกี้หนึ่งชื่อเป็นคำต่อท้ายของอีกชื่อหนึ่ง - หาก document.cookie คือ "ชื่อ = John; LastName = Doe" การเรียกแยก ("ชื่อ =") จะส่งคืนอาร์เรย์ที่มีสามสายและวิธีการ ไม่ส่งคืนค่าที่ถูกต้องสำหรับ getCookie ("ชื่อ")
Dennis Jaheruddin

20
คำเตือนเกี่ยวกับการนำไปใช้ในคำตอบนี้: หากมีมากกว่าหนึ่งคุกกี้ในชื่อเดียวกันจะไม่มีการส่งคืนค่าคุกกี้ ตัวอย่างเช่นหากมีคุกกี้ชื่อ stackToken ที่ตั้งค่าไว้สำหรับ domain .stackexchange.com และ programmers.stackexchange.com ดังนั้นหากคุณเรียกใช้ getCookie ("stackToken") จะไม่มีการคืนค่าใด ๆ - parts.length จะมากกว่า 2 หากคุณรู้ว่าค่าคุกกี้ทั้งหมดสำหรับชื่อเดียวกัน (แต่โดเมนและพา ธ ที่แตกต่างกัน) จะเหมือนกันให้ดูคำตอบที่ยอมรับได้ที่นี่: stackoverflow.com/questions/5639346/…
jlpp

7
@DennisJaheruddin - ดูเหมือนว่าปัญหาต่อท้ายได้รับการแก้ไขแล้ว
นาธาน JB

2
@ NathanJ.Brauer คุณถูกต้อง อัปเดตเพื่อแก้ไขปัญหาที่เกิดขึ้นเมื่อนานมาแล้ว แต่ทำบันทึกย่อเฉพาะในรายการเปลี่ยนแปลงแทนที่จะเป็นในความคิดเห็น
kirlich

มีความผิดของมัน หากคุกกี้ "ชื่อ" และขีดเส้นใต้ในชื่อที่คล้ายกันอีกชื่อหนึ่งIE 10+ให้ข้อผิดพลาด เช่น: "user": "Joe", "user_name":"Doe"
BOZ

176

ฉันต้องการใช้การจับคู่นิพจน์ทั่วไปบนคุกกี้:

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 ในความคิดเห็น


11
สิ่งนี้สามารถจับคู่ที่ผิดพลาดได้หากคุกกี้สองตัวมีคำต่อท้ายเหมือนกัน มันจะตรงกับทั้งสองxyz=valueและเมื่อabcxyz=value name = xyz
Brent Washburne

3
unescape((document.cookie.match(key + '=([^;].+?)(;|$)') || [])[1] || '');รุ่นที่ปรับเปลี่ยนของGlize / dom / Cookies
Valentin Podkamennyi

19
อัปเดต Regex เป็นnew RegExp('(^| )' + name + '=([^;]+)')เพื่อหลีกเลี่ยงปัญหาที่ยกขึ้นโดย @BrentWashburne นอกจากนี้ฉันได้ทำการทดสอบ jsperf สำหรับสิ่งนี้และคำตอบด้วยคะแนนโหวตสูงสุดสิ่งนี้ออกมาเล็กน้อยด้านบน แต่เป็นรหัสน้อยกว่าและง่ายต่อการติดตาม: jsperf.com/simple-get-cookie-by-name
Scott Jungwirth

5
@ScottJungwirth ใช่แล้ว แต่คุณต้องอัพเดตคำสั่ง return เพื่อส่งคืนการจับคู่ [2];
Joe

@ScottJungwirth ทำไมไม่new RegExp('(^|;)' + name + '=([^;]+)')? nameที่อยู่เบื้องหลังการเริ่มต้นของเส้นหรืออัฒภาคทำไมพื้นที่ `` หรือไม่
Junlin

89

ใช้คุกกี้เพื่อรับสคริปต์:

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 คุณควรอ่านมัน


7
... ซึ่งขโมยรหัสจาก W3schools ว้าว. w3schools.com/js/js_cookies.asp
WillWam

เฮ้อย่างน้อยฉันก็ให้เครดิต: p ​​คุณรู้ได้อย่างไรว่าเป็นต้นฉบับ?
mkoryak

โดยทั่วไปถือว่าปลอดภัยที่จะสมมติว่า W3S วางไว้ก่อน พวกเขาเป็นบ้านของมือใหม่จำนวนมากที่ ctrl-c code
WillWam

ที่จริงแล้วดูเหมือนว่ามันเป็นวิธีอื่น :) Quirksmode คือ / เป็นเว็บไซต์ที่ดีสำหรับเบราว์เซอร์นิสัยใจคอและมีแหล่งที่มาเช่นกัน scottandrew.com
sunn0

ฉันรักโรงเรียน w3 อาจเป็นแพลตฟอร์มที่ดีที่สุดสำหรับผู้สูงอายุ
Ralph Dingus

56

หากคุณใช้ 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
ไม่แน่ใจว่าทำไมสิ่งนี้ถึงไม่ได้รับการลงคะแนนเป็นคำตอบที่ดีที่สุดจริงๆ ใช่ jQuery ไม่ใช่ javascript แต่ในขณะเดียวกันมันก็เป็น !!!!
Cozzbie

21
@Cozzbie อาจรวมถึงห้องสมุดภายนอก (ดังนั้นการเพิ่มคำขอ HTTP อื่น) เพื่อดึงค่าคุกกี้เป็นชนิดของ overkill ที่ไม่จำเป็น
rahulserver

ฉันได้รับข้อผิดพลาด "Uncaught ReferenceError: $ ไม่ได้กำหนด" ที่ "$ .cookie" แม้ว่าฉันจะรวมไลบรารีที่จำเป็นทั้งหมดเช่น jquery.min.js และห้องสมุดที่แนะนำในคำตอบนี้
Adarsh ​​Singh

44

วิธีการในคำตอบอื่น ๆ ที่ใช้นิพจน์ทั่วไปไม่ครอบคลุมทุกกรณีโดยเฉพาะ:

  1. เมื่อคุกกี้เป็นคุกกี้สุดท้าย ในกรณีนี้จะไม่มีเครื่องหมายอัฒภาคหลังจากค่าคุกกี้
  2. เมื่อชื่อคุกกี้อื่นลงท้ายด้วยชื่อที่ถูกค้นหา ตัวอย่างเช่นคุณกำลังมองหาคุกกี้ชื่อ "หนึ่ง" และมีคุกกี้ที่ชื่อว่า "เสร็จสิ้น"
  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เมื่อไม่พบคู่ที่ตรงกัน ส่งกลับอาร์เรย์เมื่อพบการแข่งขันและองค์ประกอบที่ดัชนี[1]คือค่าของกลุ่มการจับคู่แรก

หมายเหตุการแสดงออกปกติ:

  1. (?:xxxx) - จัดกลุ่มที่ไม่ตรงกัน
  2. ^ - ตรงกับจุดเริ่มต้นของสตริง
  3. | - แยกรูปแบบทางเลือกสำหรับกลุ่ม
  4. ;\\s* - จับคู่เซมิโคลอนหนึ่งตัวตามด้วยศูนย์อักขระศูนย์หรือมากกว่า
  5. = - จับคู่หนึ่งเครื่องหมายเท่ากับ
  6. (xxxx) - จัดกลุ่มจับคู่
  7. [^;]*- จับคู่อักขระศูนย์หรือมากกว่านอกเหนือจากเซมิโคลอน ซึ่งหมายความว่ามันจะจับคู่อักขระได้สูงสุด แต่ไม่รวมถึงเซมิโคลอนหรือท้ายสตริง

4
คำตอบนี้เป็นฟังก์ชั่นที่ดีที่สุดและสั้นที่สุดที่ทำงานได้ในทุกกรณีโดยไม่มีการจับคู่ที่ผิด นอกจากนี้ยังมีคำอธิบายที่ดีที่สุดว่ามันทำงานอย่างไร อย่างไรก็ตามฟังก์ชั่นหลบหนีไม่ได้อธิบายและฉันจะคิดว่าถ้าผู้เขียนสร้างคุกกี้เขาจะรู้ว่าจำเป็นต้องใช้ชื่อเพื่อหลบหนีหรือไม่ ดังนั้นผมจึงอยากจะเห็นการทำงานที่สั้นลง:function getCookie(name) { var match = document.cookie.match(RegExp('(?:^|;\\s*)' + name + '=([^;]*)')); return match ? match[1] : null; }
เจฟฟ์เบเกอร์

หากเป็นเครื่องมือทั่วไปควรจะหลีกเลี่ยงชื่อหรือทำให้เกิดข้อผิดพลาดหากไม่สามารถฝังชื่อใน regex ได้โดยตรง ผู้ที่ทราบถึงข้อ จำกัด ของแอปพลิเคชันสามารถลบการหลบหนีหรือการป้องกัน
Joe Lapp

31

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)

สิ่งนี้อ่านคุกกี้ทั้งหมดแทนที่จะสแกนผ่าน ไม่เป็นไรสำหรับคุกกี้จำนวนน้อย


23

ฉันได้ปรับเปลี่ยนฟังก์ชั่นที่ 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
}

ถ้ามันส่งคืนสตริงว่างก็หมายความว่าคุกกี้มีอยู่ แต่ไม่มีค่าถ้ามันกลับเท็จแล้วคุกกี้นั้นไม่มีอยู่ ฉันหวังว่านี่จะช่วยได้.


แค่อยากรู้อยากเห็นทำไมคุณไม่ใช้varในบรรทัดที่ 3? matched = ...
Victorio Berra

ขออภัยเกี่ยวกับสิ่งนั้นลืมเขียน
Mohyaddin Alaoddin

14

ต่อไปนี้เป็นขั้นตอนเดียวในการรับคุกกี้ที่มีชื่อเฉพาะโดยไม่ต้องใช้ lib ภายนอก:

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

คำตอบนี้จะขึ้นอยู่กับวิธีการแก้ปัญหาที่ยอดเยี่ยมของ kirlich การประนีประนอมเพียงอย่างเดียวของการแก้ปัญหานี้คือคุณจะได้รับสตริงว่างเมื่อไม่มีคุกกี้ ในกรณีส่วนใหญ่สิ่งนี้ไม่ควรเป็นตัวจัดการดีล


10

ฉันรู้ว่ามันเป็นคำถามเก่า แต่ฉันก็เจอปัญหานี้ด้วย เพียงบันทึกมี API เล็กน้อยในหน้านักพัฒนาโมซิลล่าหน้าเว็บของ

Yoy สามารถรับคุกกี้ได้ด้วยชื่อโดยใช้ JS เท่านั้น รหัสนี้ยังสะอาดกว่า IMHO (ยกเว้นสายยาวฉันแน่ใจว่าคุณสามารถแก้ไขได้)

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

ตามที่ระบุไว้ในความคิดเห็นโปรดทราบว่าวิธีการนี้ถือว่าคีย์และค่าถูกเข้ารหัสโดยใช้ encodeURIComponent () ลบการถอดรหัส & encodeURIComponent () หากคีย์และค่าของคุกกี้ไม่ถูกเข้ารหัส


1
เพิ่งทราบว่าวิธีการสันนิษฐานว่าทั้งชื่อและค่าของคุกกี้นั้นถูกเข้ารหัสโดยใช้encodeURIComponent()เมื่อตั้งค่าคุกกี้ซึ่งจะเป็นจริงถ้าคุณใช้ฟังก์ชั่นสหายในการตั้งค่าคุกกี้ แต่อาจไม่ได้เป็นอย่างนั้นเสมอไป ทดสอบ
John S

@ JohnS เราสามารถลบ decodeURIComponent ได้ใช่ไหม (ถ้าเราไม่ได้ใช้เพื่อตั้งค่าคุกกี้) มันจะยังใช้งานได้หรือไม่
NiCk Newman

ใช่เพิ่งนำ decodeURI ออกและ regexp นี้เป็นสัตว์ประหลาด ขอบคุณมาร์คโหวต!
NiCk Newman

10

คุณสามารถใช้ไลบรารีjs-cookieเพื่อรับและตั้งค่าคุกกี้ JavaScript

รวมถึง HTML ของคุณ:

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

วิธีสร้างคุกกี้:

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

วิธีอ่านคุกกี้:

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

8

นี่เป็นเวอร์ชั่นสั้น ๆ

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

โปรดทราบว่าฉันใช้ประโยชน์จากเทมเพลตสตริงของ ES6 เพื่อสร้างการแสดงออก regex


2
คำตอบที่ดีที่สุดจากนี้ ใช้คุณสมบัติ ES6 มันเป็น 2,017 คนและยังคงใช้var, +การ concatenate ฯลฯ -.-'
อีเลียส Soares

@EliasSoares ปัญหาของการใช้varคืออะไร
mrReiha


ไม่ใช่ปัญหา แต่ใช้ let เป็นวิธีปฏิบัติที่ดีเนื่องจากมีข้อดีในหลาย ๆ สถานการณ์และแทบจะไม่มีข้อเสีย
Elias Soares

7

ใช้ 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 );

การดำเนินการนี้จะอัปเดตโดยอัตโนมัติด้วยดังนั้นหากคุณเปลี่ยนคุกกี้Cookiesจะเปลี่ยนไปเช่นกัน


2
ที่สมบูรณ์แบบ! ยกเว้นว่ามันจะไม่ทำงานสำหรับวัตถุที่มีตัวละครบางอย่างเช่นขีดคั่น (ชื่อคุกกี้) cookies[(cookie.split("=")[0]).replace(/ /g,'')] = ..และเมื่อแยกวัตถุมีพื้นที่ว่างบนแรกดังนั้นฉันไป ขอบคุณ !!
ซามูเอล Elh

@Samuel Elh ถูกต้อง แต่คุณสามารถใช้. trim () แทนการแทนที่ (/ / g, '')
mtizziani

7

kirlichให้ทางออกที่ดี อย่างไรก็ตามมันล้มเหลวเมื่อมีสองค่าคุกกี้ที่มีชื่อคล้ายกันนี่คือการแก้ไขอย่างง่ายสำหรับสถานการณ์นี้:

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

6

ทำงานได้ดีเสมอ:

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

ไม่มีข้อกำหนดสำหรับ jQuery หรืออะไร จาวาสคริปต์ที่ดีบริสุทธิ์



6

ฟังก์ชั่นง่าย ๆ สำหรับรับคุกกี้ด้วยชื่อคุกกี้:

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

เห็นได้ชัดว่า MDN ไม่เคยได้ยินเกี่ยวกับคลาสอักขระ regex ของคำ\bซึ่งจับคู่กันอย่างต่อเนื่อง\w+ที่ล้อมรอบทั้งสองด้านด้วย\W+:

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

var obligations = getCookie('obligations');

5

ดูเหมือนว่าคุณสามารถแบ่งคู่คีย์ - ค่าคุกกี้ออกเป็นอาร์เรย์และยึดการค้นหาของคุณบน:

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

1
มีวิธีใช้ document.cookie.indexOf (ชื่อ) และเปรียบเทียบหรือไม่

@AndrejHefner คุณทำได้แม้ว่าจะตรงกับสตริงย่อย ดังนั้นหากคุณมีชื่อคุกกี้ "foobar" และอีกชื่อหนึ่งคือ "bar" คุณอาจสับสน "bar" ใน "foobar" ด้วยคีย์ "bar"
Sampson

@AndrejHefner โปรดดูวิธีการในภายหลังซึ่งควรจะเร็วกว่าเนื่องจากตรวจสอบสตริงสำหรับการแข่งขัน
Sampson

1
วิธีที่สองมีข้อบกพร่องซึ่งจะไม่พบค่าคุกกี้ล่าสุดเนื่องจากจะหา a; ในตอนท้าย รุ่นแก้ไขจะเป็น:function getCookieData( name ) { var patrn = new RegExp( "(?:^| )" + name + "=(.*?)(?:;|$)" ); if ( match = (document.cookie.match(patrn) )) return match[1]; return false; }
Oz Solomon

5

ในโครงการของฉันฉันใช้ฟังก์ชันต่อไปนี้เพื่อเข้าถึงคุกกี้ตามชื่อ

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

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

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

ถ้า cookie log = true มีอยู่คุณจะได้รับ 2 ถ้าไม่ใช่ 1

log = true - เปลี่ยนเป็นคุ๊กกี้ name = value หรือเพียงแค่ชื่อ


1
มันจะไม่สามารถอ่านได้มากกว่าที่จะใช้.indexOf() >= 0แทน?
Vic Seedoubleyew

3

มีคำตอบที่ดีอยู่แล้วสำหรับการรับคุกกี้อย่างไรก็ตามนี่คือทางออกของฉัน:

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

3

กำหนดโดย javascript

document.cookie = 'cookiename=tesing';

รับโดย jquery ด้วยปลั๊กอิน jquery-cookie

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

alert(value);

@cytsunny - นี่เป็นเพราะคุณต้องมีปลั๊กอินคุกกี้ jquery เพื่อใช้งาน
Alex Standiford

ว้าว .... ข้อมูลสำคัญที่ขาดหายไปก่อนหน้านี้ .... แต่จากลิงก์ที่คุณให้ไว้ดูเหมือนว่าเจ้าของห้องสมุดตัดสินใจว่าพวกเขาจะลบการพึ่งพา jquery ออกไป
cytsunny


2

ทางออกของฉันคือ:

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

ฟังก์ชันนี้ใช้ฟังก์ชัน Underscorejs _.find-function ส่งคืนไม่ได้กำหนดถ้าไม่มีชื่อคุกกี้


2

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

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

วิธีการทำงานเพื่อค้นหาคุกกี้ที่มีอยู่ ส่งคืนอาร์เรย์ดังนั้นจึงรองรับการเกิดชื่อเดียวกันหลายครั้ง ไม่รองรับการจับคู่คีย์บางส่วน แต่มันสำคัญที่จะแทนที่ === ในตัวกรองด้วย regex

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

เพียงใช้ฟังก์ชั่นต่อไปนี้ (รหัสจาวาสคริปต์ที่บริสุทธิ์)

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

รับคุกกี้ตามชื่อเพียงแค่ส่งชื่อคุกกี้ไปยังฟังก์ชันด้านล่าง

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

ฟังก์ชั่นดังต่อไปนี้จะส่งคืนkey-valueคู่ของคุกกี้ที่ต้องการซึ่ง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;
};

0

ตัวอย่างคุกกี้: ตัวอย่าง 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

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