Asumsi
Berdasarkan pertanyaan, saya percaya beberapa asumsi / persyaratan untuk fungsi ini meliputi:
- Ini akan digunakan sebagai fungsi perpustakaan , dan dimaksudkan untuk dimasukkan ke basis kode apa pun;
- Karena itu, perlu bekerja di banyak lingkungan yang berbeda , yaitu bekerja dengan kode JS lama, CMS dari berbagai tingkat kualitas, dll .;
- Untuk beroperasi dengan kode yang ditulis oleh orang lain dan / atau kode yang tidak Anda kontrol, fungsi tersebut tidak boleh membuat asumsi tentang bagaimana nama atau nilai cookie dikodekan . Memanggil fungsi dengan string
"foo:bar[0]"
harus mengembalikan cookie (secara harfiah) bernama "foo: bar [0]";
- Cookie baru dapat ditulis dan / atau cookie yang ada dimodifikasi pada titik mana pun selama masa halaman.
Di bawah asumsi ini, jelas bahwa encodeURIComponent
/ decodeURIComponent
tidak boleh digunakan ; melakukan hal itu dengan asumsi bahwa kode yang mengatur cookie juga menyandikannya menggunakan fungsi-fungsi ini.
Pendekatan ekspresi reguler menjadi bermasalah jika nama cookie dapat berisi karakter khusus. jQuery.cookie mengatasi masalah ini dengan menyandikan nama cookie (sebenarnya nama dan nilai) ketika menyimpan cookie, dan mendekode nama saat mengambil cookie. Solusi ekspresi reguler di bawah.
Kecuali Anda hanya membaca cookie yang Anda kontrol sepenuhnya, juga disarankan untuk membaca cookie dari document.cookie
langsung dan tidak men-cache hasil, karena tidak ada cara untuk mengetahui apakah cache tidak valid tanpa membacadocument.cookie
lagi.
(Walaupun mengakses dan menguraikan document.cookies
akan sedikit lebih lambat daripada menggunakan cache, itu tidak akan selambat membaca bagian lain dari DOM, karena cookie tidak memainkan peran dalam pohon DOM / render.)
Fungsi berbasis loop
Inilah jawaban Code Golf, berdasarkan fungsi PPK (berbasis loop):
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, '');
}
yang ketika diperkecil, mencapai 128 karakter (tidak termasuk nama fungsi):
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,'');}
Fungsi berbasis ekspresi reguler
Pembaruan: Jika Anda benar-benar menginginkan solusi ekspresi reguler:
function readCookie(name) {
return (name = new RegExp('(?:^|;\\s*)' + ('' + name).replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') + '=([^;]*)').exec(document.cookie)) && name[1];
}
Ini lolos dari setiap karakter khusus dalam nama cookie sebelum membangun objek RegExp. Diminimalkan, ini sampai 134 karakter (tidak termasuk nama fungsi):
function readCookie(n){return(n=new RegExp('(?:^|;\\s*)'+(''+n).replace(/[-[\]{}()*+?.,\\^$|#\s]/g,'\\$&')+'=([^;]*)').exec(document.cookie))&&n[1];}
Seperti yang ditunjukkan oleh Rudu dan cwolves dalam komentar, regex reguler-ekspresi-pelarian dapat dipersingkat oleh beberapa karakter. Saya pikir itu akan baik untuk menjaga regex melarikan diri konsisten (Anda mungkin menggunakannya di tempat lain), tetapi saran mereka patut dipertimbangkan.
Catatan
Kedua fungsi ini tidak akan menangani null
atau undefined
, yaitu jika ada cookie bernama "null", readCookie(null)
akan mengembalikan nilainya. Jika Anda perlu menangani kasus ini, sesuaikan kode tersebut.