สมมติฐาน
จากคำถามที่ฉันเชื่อว่าสมมติฐาน / ข้อกำหนดสำหรับฟังก์ชั่นนี้รวมถึง:
- มันจะถูกใช้เป็นฟังก์ชั่นห้องสมุดและตั้งใจที่จะทิ้งลงในโค้ดฐาน
- ดังนั้นจะต้องทำงานในสภาพแวดล้อมที่แตกต่างกันเช่นทำงานกับรหัส JS ดั้งเดิม CMSes คุณภาพระดับต่างๆ ฯลฯ
- การระหว่างงานกับโค้ดที่เขียนโดยคนอื่น ๆ และ / หรือรหัสที่คุณไม่สามารถควบคุมฟังก์ชั่นไม่ควรทำให้สมมติฐานใด ๆ ในการชื่อหรือค่าคุกกี้จะถูกเข้ารหัส การเรียกฟังก์ชันด้วยสตริง
"foo:bar[0]"
ควรส่งคืนคุกกี้ (ตามตัวอักษร) ชื่อ "foo: bar [0]";
- อาจมีการเขียนคุกกี้ใหม่และ / หรือคุกกี้ที่มีอยู่ซึ่งแก้ไขได้ทุกช่วงอายุของหน้าเว็บ
ภายใต้สมมติฐานเหล่านี้เป็นที่ชัดเจนว่าencodeURIComponent
/ decodeURIComponent
ไม่ควรใช้ ; การทำเช่นนั้นจะถือว่ารหัสที่ตั้งค่าคุกกี้นั้นเข้ารหัสด้วยฟังก์ชั่นเหล่านี้
วิธีการแสดงออกปกติได้รับปัญหาหากชื่อคุกกี้สามารถมีอักขระพิเศษ jQuery.cookie แก้ไขปัญหานี้โดยการเข้ารหัสชื่อคุกกี้ (อันที่จริงทั้งชื่อและค่า) เมื่อเก็บคุกกี้และถอดรหัสชื่อเมื่อดึงคุกกี้ วิธีแก้ปัญหาการแสดงออกปกติอยู่ด้านล่าง
นอกจากว่าคุณจะอ่านเฉพาะคุกกี้ที่คุณควบคุมอย่างสมบูรณ์ก็จะแนะนำให้อ่านคุกกี้document.cookie
โดยตรงและไม่แคชผลลัพธ์เนื่องจากไม่มีวิธีที่จะทราบว่าแคชไม่ถูกต้องหากไม่อ่านdocument.cookie
อีกครั้ง
(ในขณะที่การเข้าถึงและการแยกวิเคราะห์document.cookies
จะช้ากว่าการใช้แคชเล็กน้อยมันจะไม่ช้าเท่ากับการอ่านส่วนอื่น ๆ ของ DOM เนื่องจากคุกกี้ไม่มีบทบาทในต้นไม้ DOM / การแสดงผล)
ฟังก์ชั่นแบบวนซ้ำ
ต่อไปนี้เป็นคำตอบของ Code Golf ซึ่งขึ้นอยู่กับฟังก์ชั่นของ PPK (ตามวง):
function readCookie(name) {
name += '=';
for (var ca = document.cookie.split(/;\s*/), i = ca.length - 1; i >= 0; i--)
if (!ca[i].indexOf(name))
return ca[i].replace(name, '');
}
ซึ่งเมื่อย่อเล็กสุดมาที่ 128 ตัวอักษร (ไม่นับชื่อฟังก์ชั่น):
function readCookie(n){n+='=';for(var a=document.cookie.split(/;\s*/),i=a.length-1;i>=0;i--)if(!a[i].indexOf(n))return a[i].replace(n,'');}
ฟังก์ชั่นการแสดงออกตามปกติ
อัปเดต:หากคุณต้องการโซลูชันนิพจน์ทั่วไป:
function readCookie(name) {
return (name = new RegExp('(?:^|;\\s*)' + ('' + name).replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') + '=([^;]*)').exec(document.cookie)) && name[1];
}
นี้หนีตัวอักษรพิเศษใด ๆ ในชื่อคุกกี้ก่อนที่จะสร้างวัตถุ RegExp ลดขนาดมาที่ 134 ตัวอักษร (ไม่นับชื่อฟังก์ชั่น):
function readCookie(n){return(n=new RegExp('(?:^|;\\s*)'+(''+n).replace(/[-[\]{}()*+?.,\\^$|#\s]/g,'\\$&')+'=([^;]*)').exec(document.cookie))&&n[1];}
ในขณะที่ Rudu และ cwolves ได้ชี้ให้เห็นในความคิดเห็น regex นิพจน์ทั่วไปที่หลบหนีสามารถทำให้สั้นลงได้โดยตัวละครไม่กี่ตัว ฉันคิดว่ามันจะเป็นการดีถ้าให้ regex ที่หลบหนีสอดคล้องกัน (คุณอาจใช้มันที่อื่น) แต่คำแนะนำของพวกเขานั้นคุ้มค่าที่จะพิจารณา
หมายเหตุ
ทั้งสองฟังก์ชั่นเหล่านี้จะไม่จัดการnull
หรือundefined
ถ้ามีคุกกี้ชื่อ "null" readCookie(null)
จะส่งคืนค่าของมัน หากคุณต้องการจัดการกรณีนี้ให้ปรับรหัสให้เหมาะสม