Припущення
Виходячи з питання, я вважаю, що деякі припущення / вимоги до цієї функції включають:
- Він буде використовуватися як функція бібліотеки , а значить, потрапить у будь-яку кодову базу;
- Таким чином, йому потрібно буде працювати в багатьох різних середовищах , тобто працювати зі застарілим кодом JS, CMS різного рівня якості тощо;
- Для взаємодії з кодом, написаним іншими людьми, та / або кодом, яким ви не керуєте, функція не повинна робити жодних припущень щодо того, як кодуються імена файлів cookie та значення . Виклик функції за допомогою рядка
"foo:bar[0]"
повинен повернути файл cookie (буквально) з назвою "foo: bar [0]";
- Нові файли cookie можуть бути записані та / або існуючі файли cookie, змінені в будь-яку точку життя сторінки.
Згідно з цими припущеннями, зрозуміло, що encodeURIComponent
/ decodeURIComponent
не слід використовувати ; при цьому передбачається, що код, який встановлює файл cookie, також кодував його за допомогою цих функцій.
Підхід до регулярного вираження стає проблематичним, якщо ім'я файлу cookie може містити спеціальні символи. jQuery.cookie вирішує цю проблему, кодуючи ім'я файлу cookie (власне і ім’я, і значення) під час зберігання файлу cookie, і декодує ім'я під час отримання файлу cookie. Розчин регулярного вираження нижче.
Якщо ви лише читаєте файли cookie, якими ви керуєте повністю, також було б доцільно читати файли cookie document.cookie
безпосередньо та не кешувати результати, оскільки немає способу дізнатися, чи кеш недійсний без document.cookie
повторного читання .
(Хоча доступ і аналіз document.cookies
будуть трохи повільнішими, ніж використання кешу, це буде не так повільно, як читання інших частин DOM, оскільки файли cookie не грають ролі в 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];
}
Це уникає будь-яких спеціальних символів у назві файлів cookie перед побудовою об'єкта RegExp. У мінімізованому вигляді це до 134 символів (не рахуючи назви функції):
function readCookie(n){return(n=new RegExp('(?:^|;\\s*)'+(''+n).replace(/[-[\]{}()*+?.,\\^$|#\s]/g,'\\$&')+'=([^;]*)').exec(document.cookie))&&n[1];}
Як в коментарях зазначали Руду та каульви, регулярний вираз, що виходить з виразів, може бути скорочений на кілька символів. Я думаю, що було б добре підтримувати регулярний регулярний вираз (ви можете використовувати його в іншому місці), але їх пропозиції варто розглянути.
Примітки
Обидві ці функції не буде обробляти null
або undefined
, наприклад , якщо є печиво під назвою «нуль», readCookie(null)
поверне його значення. Якщо вам потрібно розібратися в цьому випадку, адаптуйте код відповідно.